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