ios - Swift 2 - prepareForSegue 无值

标签 ios uitableview segue uistoryboardsegue

当在 UITableView 中选择一行时,我试图在另一个 View 上发送链接。 当我选择该行时,我可以看到打印了链接,但是该值没有到达函数 prepareForSegue。 似乎在 UITableView 中的选择行之前调用了 prepareForSegue 函数。

var videouserPath = ""

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

        videouserPath =  self.arrayUserVideo[indexPath.row][4]
        print("tableview: ----\(videouserPath)")
    }


    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        print("segue: ----\(videouserPath)")
        if segue.identifier == "toUserVideo"

        {
            if let destinationVC = segue.destinationViewController as? GetVideo_ViewController{

                destinationVC.videoToDisplay = videouserPath
            }
        }
    }

我进入了调试:

segue: ----

tableview: ----https://example.com/resources/1361929513_02-02-2016_125830.mov

为什么选择前会调用segue函数?

最佳答案

当从 Storyboard 中将 UIStoryboardSegue 链接到 UITableViewCell 时,消息传递的顺序为 prepareForSeguedidSelectRowAtIndexPath

自动方法

完全绕过 didSelectRowAtIndexPath

对于通用和单选单元格,您不需要实现 didSelectRowAtIndexPath。让与 UITAbleViewCell 关联的 segue 完成工作,并像这样处理选择:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "detailSegueIdentifier" {
        if let indexPath = tableView.indexPathForSelectedRow {
            print(indexPath)
        }
    }
}

手动方法

如果您确实需要在转场之前做额外的工作,请不要将其与 UITableViewCell 关联,而是与 UITableViewController 关联。然后您需要以编程方式触发它。灵感here .
IB中,将segue分配给 TableView Controller ,给它一个标识符(例如detailSegueIdentifier),然后像这样调用它。

    override func tableView(tableView: UITableView,
                            didSelectRowAtIndexPath indexPath: NSIndexPath) {
        print("didSelectRowAtIndexPath")
        self.performSegueWithIdentifier("detailSegueIdentifier", sender: nil)
    }

将参数传递给 segue:

调用 performSegueWithIdentifier 还将为您提供显式传递参数的机会,而不是事后猜测 indexPathForSelectedRow,并且不依赖于全局 (*)。

override func tableView(tableView: UITableView,
                        didSelectRowAtIndexPath indexPath: NSIndexPath) {
    print("didSelectRowAtIndexPath")
    self.performSegueWithIdentifier("detailSegueIdentifier", sender: indexPath)
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "detailSegueIdentifier" {
        if let indexPath = sender as? NSIndexPath {
            let name = db[indexPath.row].key
            if let controller = segue.destinationViewController as? DetailViewController {
                controller.name = name
            }
        }
    }
}

(*) 如果可以的话,永远不要依赖全局变量

关于ios - Swift 2 - prepareForSegue 无值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35157333/

相关文章:

ios - 在 IOS 应用程序中使用数据库

uitableview - Xcode 5 - 静态 TableView 不会出现在模拟器上

ios - cellForRowAt 在 childTableView 中不起作用

android - 点击游戏请求发送的通知时 Facebook 未发现错误

ios - SQL.swift 从多个表中选择

ios - Swift PrepareForSegue NSIndexPath 错误

ios - 什么时候为嵌入式 viewController 调用 prepareForSegue?

ios - Swift - 无法使用performSegueWithIdentifier

ios - Storyboard-JPEG

swift - 如何在 UITableView SWIFT 中加载更多单元格