当我在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函数?
答案 0 :(得分:1)
从故事板中链接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)
}
}
}
如果你绝对需要在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
}
}
}
}
(*)如果可以提供帮助,请不要依赖全局。