未从自定义 uitableviewcell 调用 prepareForSegue

Posted

技术标签:

【中文标题】未从自定义 uitableviewcell 调用 prepareForSegue【英文标题】:prepareForSegue not called from custom uitableviewcell 【发布时间】:2014-10-07 13:17:04 【问题描述】:

我有一个带有自定义 TableViewCell 的自定义 TableViewController。我在故事板上创建了一个从 Cell 到另一个 ViewController 的 segue 以显示详细信息,但从不调用 prepareForSegue。我试过使用 didSelectRowAtIndexPath 但它也没有被调用。我怀疑这可能是因为我动态创建了自定义单元格并且它们没有从分配给它们的情节提要中获得转场,但我找不到这样做的方法。我的 BarButtonItem 中的“newSegue”被正常调用。

override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) 
    println("PREPARE FOR SEGUE")
    if segue.identifier == "newSegue" 
        println("PREPARE FOR NEW SEGUE")
     else if segue.identifier == "detailSegue" 
        println("PREPARE FOR DETAIL SEGUE")
    


override func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) 
    println("You selected cell!")

我怀疑我在定义自定义单元格时可能做错了:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

    let CellIndentifier: NSString = "ListPrototypeCell"

    var cell : MyTableViewCell = tableView.dequeueReusableCellWithIdentifier(CellIndentifier) as MyTableViewCell

    var myClass: MyClass = self.myList.objectAtIndex(indexPath.row) as MyClass

    cell.setCell(author: myClass.author, message: myClass.message)

    return cell


有什么帮助吗?

【问题讨论】:

您是否将这段代码所在的控制器设置为表格视图的委托(如果您的类是 UITableViewController 的子类,则应自动设置)?单元格中是否有可能拦截触摸的视图? 是的,我将它设置为委托。该单元格有其自定义视图,但我无法从视图或标签创建一个 segue。 您必须从单元格本身进行连接,而不是从内容视图或标签。如果无法从画布中抓取单元格,则转到左侧的场景列表,然后从那里的单元格中拖动。 这正是我所做的。我从牢房连接,但 segue 没有触发。我想将点击手势事件附加到我的单元格类,但我不认为这是合适的解决方案。 听起来您已经正确设置了它,所以如果没有实际看到您的项目,很难说出哪里出了问题。如果你能把它贴在某个地方或通过电子邮件发送给我,我很乐意看看。 【参考方案1】:

从 InterfaceBuilder 中的 TableViewController 中拖动 segue,而不是从单元格中。然后您可以通过performSegueWithIdentifier 使用didSelectRowAtIndexPath 中的标识符执行segue。

还要检查函数签名。不再需要隐式解包选项的感叹号:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    let cell = tableView.cellForRowAtIndexPath(indexPath)
    tableView.deselectRowAtIndexPath(indexPath, animated: true)
    performSegueWithIdentifier("mySegue", sender: cell)


override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 

【讨论】:

这是一种解决方法,而不是解决 OP 问题的方法。这不会起作用,因为 OP 说没有调用 didSelectRowAtIndexPath。 我也尝试过这种方法,但是,正如我所说,没有调用 didSelectRowAtIndexPath。单元格在 MyTableViewCell.swift 中定义。我不知道这是否会导致问题。 您的didSelectRowAtIndexPath 签名不正确,因此不会被调用。检查我上面的示例代码。您必须删除感叹号。 Xcode beta 阶段代码签名发生变化,自动代码补全仍然不正确。 我删除了感叹号,它仍然没有被调用。我怀疑在定义我的自定义单元格时我可能会遗漏一些东西。我会将代码添加到我原来的问题中。 prepareForSeque 同理:去掉感叹号。我已经更新了上面的答案。

以上是关于未从自定义 uitableviewcell 调用 prepareForSegue的主要内容,如果未能解决你的问题,请参考以下文章

如何从自定义 UITableViewCell 调用操作以重新加载 tableView

Segue 未从自定义 tableView 单元格触发

为啥 Core Data 获取请求从自定义 UITableViewCell 返回空?

如何从自定义 UITableViewCell 获取值到 ViewController?

从自定义 UITableViewCell 保存数据

如何从自定义 UITableViewCell 触发 segue - iOS7