当在 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
时,消息传递的顺序为 prepareForSegue
、didSelectRowAtIndexPath
。
自动方法
完全绕过 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/