Swift 2 - prepareForSegue nil Value

时间:2016-02-02 15:23:23

标签: ios uitableview segue uistoryboardsegue

当我在UITableView中选择一行时,我正尝试在另一个视图上发送链接。 当我选择行时,我可以看到链接被打印,但是值不会到达函数prepareForSegue。 好像在prepareForSegue中的选择行之前调用UITableView函数。

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函数?

1 个答案:

答案 0 :(得分:1)

从故事板中链接UIStoryboardSegueUITableViewCell时,消息传递的顺序为prepareForSeguedidSelectRowAtIndexPath

自动方法

完全绕过didSelectRowAtIndexPath

对于通用和单选单元格,您不需要实现didSelectRowAtIndexPath。让与UITAbleViewCell相关联的segue完成工作,并按如下方式处理选择:

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

手动方法

如果你绝对需要在segue之前做额外的工作,不要将它与UITableViewCell相关联,而是与UITableViewController相关联。然后,您需要以编程方式触发它。灵感here
IB 中,将segue分配给表视图控制器,为其指定一个标识符(比如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
            }
        }
    }
}

(*)如果可以提供帮助,请不要依赖全局