2017-05-01 74 views
0

我有一个UITableView的单元格,从右向左滑动时已经实现了两个自定义按钮(UITableViewRowAction编辑操作)。一切运作良好。UITableViewCell“全”滑动,从右到左

我想在用户滑动“一路”(也是从右到左)时触发其中一个按钮的动作,类似于Mail.app。

代码是斯威夫特3,适用于iOS 9和10

我有什么,我认为是已具备足够的代码。

func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle { 
    return .delete 
} 

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 
    print("commit editingStyle") 
} 

commit editingStyle功能永远不会触发,因为我希望它。

我删除了我的editActionsForRowAt方法,或许是因为我在定义自定义按钮时搞了些东西。我现在看到默认的“删除”按钮,但commit editingStyle仍然不会启动。

对于什么是值得的,这是UITiewController(不是UITableViewController)中的UITableView,其中.dataSource和.delegate都设置为有问题的类。它也是一个NSFetchedResultsControllerDelegate。

+0

即使是Master/Detail模板项目(Xcode 8.3.2)也有这些方法,并且不支持完整的刷卡。也许我正在阅读的内容,建议从右到左完全刷卡是内置的,是不准确的。 –

回答

0

UISwipeGestureRecognizer附加到表格本身,而不是单个单元格。当检测到轻扫时,计算哪个单元被轻扫,并相应地调用您的轻扫动作。

+0

我想过这个,但感觉就像我宁愿避免的那种黑客。我相信'commit editingStyle'是为此目的而存在的,所以我希望能够实现这一点。 –

0

补充一点:

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { 
    return true 
} 
+0

已经到位 - 我应该在我的原始问题中包含这些内容。按预期调用此函数。 (对于一次刷卡,它被称为三次,无论什么值得。) –

0

,我想出了一个机制来做到这一点,我不认为这是一个黑客的太多 - 肯定比其他解决方案,我发现少了那么。欢迎评论。

我的意图是始终使用尽可能多的标准功能。我正在做的是跟踪用户将单元主体向左滑动了多远。当达到某个阈值时,我告诉UITableView执行editActionsForRowAt调用的相同操作。

我使用-225作为单元格左移多远的阈值。这可能不适用于所有的实现(我可以用更多的测试来修改自己)。在我的情况下,我有两个自定义操作,其中一个的按钮有点宽泛。

我真正添加的唯一东西是NSTimer,我使用.UITrackingRunLoopMode添加到主运行循环中。这有利于在用户移动手指时(并且只有当用户移动他们的手指时)。当定时器触发时,我检查单元与主机tableView的相对位置。没有添加视图,没有添加手势识别器。

在自定义的UITableViewCell,我加了这一点:

var trackTimer:Timer? = nil 
weak var tableView:StudentsLessonsViewController? = nil 

override func awakeFromNib() { 
    super.awakeFromNib() 
    setupTimer() 
} 

override func prepareForReuse() { 
    super.prepareForReuse() 
    setupTimer() 
} 

func setupTimer() { 
    self.trackTimer = Timer.init(timeInterval: 0.1, target: self, selector: #selector(performActionIfScrolledFarEnough), userInfo: nil, repeats: true) 
    if let trackTimer = self.trackTimer { 
     RunLoop.main.add(trackTimer, forMode: .UITrackingRunLoopMode) 
    } 
} 

func performActionIfScrolledFarEnough() { 
    let globalPoint = self.superview?.convert(self.frame.origin, to: self.tableView?.tableView) 
    //print("globalPoint.x: \(String(describing: globalPoint?.x))") 
    if let globalPoint = globalPoint { 
     if globalPoint.x < CGFloat(-225) { 
      //print ("Perform Action NOW!!!") 
      trackTimer?.invalidate() 
      if let tableView = self.tableView { 
       tableView.primaryActionButtonPressed(cell: self) 
      } 
     } 
    } 
} 

在UITableView中的的cellForRowAtIndexPath,我说:

cell?.tableView = self 

我已经在我的UITableView有这个功能,我打电话时,用户点击editActionsForRowAt中定义的按钮之一:

func tableView.primaryActionButtonPressed(cell:UITableViewCell) 

In我primaryActionButtonPressed函数我从tableView中删除单元格(概念上像删除)。有可能不同的操作可能需要不同的实现细节。