TableView 单元格,滑动操作和不同的 segues Swift 4

Posted

技术标签:

【中文标题】TableView 单元格,滑动操作和不同的 segues Swift 4【英文标题】:TableView cell, swipeactions and different segues Swift 4 【发布时间】:2018-01-19 19:35:49 【问题描述】:

在 ViewController A 中,我有一个带有两个 trailingSwipeAction 和一个leadingSwipeAction 的 TableView。如果您点击单元格,则 ViewController B 有一个 segue。 trailingSwipeActions 调用 ActionSheets,在 ViewController A 内处理。 segue 从“准备 segue”函数中执行。这一切都很好。

现在我想为您执行leadingSwipeAction 添加另一个segue。该segue必须导致ViewController C。我无法在Storyboard中添加另一个segue,从customcell到ViewController C ...然后当我单击单元格时...只有一个segue被调用(而不是另一个) .所以……怎么办。

这是我的代码的相关部分:

override func tableView(_ tableView: UITableView,
                        leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?

    let weightAction = UIContextualAction(style: .normal, title:  "Gewicht", handler:  (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
        success(true)
    )
    weightAction.image = UIImage(named: "Scale")
    weightAction.backgroundColor = UIColor(red: 0/255, green: 122/255, blue: 255/255, alpha: 1)
    return UISwipeActionsConfiguration(actions: [weightAction])

我想要什么:如果你点击名为“Scale”的图标,你会触发一个到 ViewController C 的 segue。

还有我的“准备转场”功能的代码(用于转场到 ViewController B):

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    if segue.identifier == "detailSegue"
        let rowClicked = (self.tableView.indexPathForSelectedRow?.row)!
        let destVC = segue.destination as! UINavigationController
        let slideVC = destVC.topViewController as! detailViewController
        slideVC.araKuiken = araKuikens[rowClicked]
    

那么如何向 ViewController C 添加一个 segue,当我点击“缩放”按钮时会调用它?

【问题讨论】:

【参考方案1】:

如果您希望 weightAction 触发对 viewController C 的转场,您只需在处理程序块中执行转场,如下所示:

let weightAction = UIContextualAction(style: .normal, title:  "Gewicht", handler:  (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
    self.performSegue(withIdentifier: "viewControllerC", sender: ac)
    success(true)
)

然后,在您的 prepare 代码中,您也想处理这种可能性:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
  if segue.identifier == "detailSegue"
    let rowClicked = (self.tableView.indexPathForSelectedRow?.row)!
    let destVC = segue.destination as! UINavigationController
    let slideVC = destVC.topViewController as! detailViewController
    slideVC.araKuiken = araKuikens[rowClicked]
   else if segue.identifier == "viewControllerC" 
    //Perform your preparation code here
  

当然,您仍然需要在 Storyboard 中创建 segue,正如您所提到的,通过从 viewControllerA 顶部的黄色圆圈拖动到 viewControllerC,并为其命名(我使用“viewControllerC”作为示例)。

【讨论】:

太好了,现在可以了。但是...如何获取“选定”行的 indexPath?因为我没有点击该行......但只从左向右滑动“让 rowClicked = (self.tableView.indexPathForSelectedRow?.row)!”不起作用... 好吧,我不知道它有多“正确”,但您始终可以将 indexPath 作为发件人传递给您的perform,而不是作为发件人传递操作。或者您可以在执行操作时设置一些临时变量,并在您的 prepare 代码中访问该临时变量。【参考方案2】:

当单元格显示侧边菜单leadingSwipeActionsConfigurationForRowAt()时,我将indexPath保存在一个变量中

然后我在 Prepare() 方法中使用它

    if let indexPath = self.indexPathSelected 
        if segue.identifier == "IdentifierA" 

        else if segue.identifier == "IdentifierB" 
            let destino          = segue.destination as! VCdestinarion
            destino.intLibro     = Int(self.arrData[indexPath.row][1]
        


    

这对我有用。

问候

【讨论】:

以上是关于TableView 单元格,滑动操作和不同的 segues Swift 4的主要内容,如果未能解决你的问题,请参考以下文章

如何在 tableView 中创建自定义单元格(滑动单元格)

如何在自定义滑动(而不是滑动删除)单元格(滑动到邮件/短信)中点击一个单元格时删除在其他 TableView 单元格中添加的子视图

如何在 TAP 上编辑 tableview 单元格而不是滑动 - Swift

滑动 UITableViewCell 操作会影响表格视图中的每 4 个单元格,而不仅仅是目标单元格

iOS Swift:滑动表格单元格以执行操作(不显示)

Tableview 控制器在其静态单元格中具有动态 tableview