在prepareForSegue()之前调用两次segue.destinationViewController的viewDidLoad()

时间:2016-03-07 10:54:01

标签: ios iphone uiviewcontroller uistoryboardsegue

所以我要做的是通过didSelectRowAtIndexPath中的prepareForSegue方法的sender参数将tableViewController中的对象发送到collectionViewController,但由于某种原因,该prepareViewController的viewDidLoad方法在prepareForSegue之前被调用两次。这是tableViewController中的相关代码:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let challenge = dataModel.challenges[indexPath.row]
    performSegueWithIdentifier("ShowChallengeSegue", sender: challenge)
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    ...
    else if segue.identifier == "ShowChallengeSegue" {
        let controller = segue.destinationViewController as! ChallengeViewController
        controller.challenge = sender as! Challenge
    }
}

添加一堆打印语句后,按顺序发生以下情况:

  1. tableViewController的didSelectRowAtIndexPath被称为
  2. destinationViewController(collectionViewController)viewDidLoad被称为
  3. 再次调用destinationViewController(collectionViewController)viewDidLoad
  4. tableViewController的prepareForSegue被称为
  5. 我不知道为什么会这样,感谢任何帮助。

    编辑 - 我用tableViewController替换了collectionViewController,一切似乎都运行正常,因此它可能与UICollectionViewController特别相关。

2 个答案:

答案 0 :(得分:0)

你必须从细胞而不是整个控制器中取出segue,以便segue执行两次

请从Controller获取segue然后尝试

OR

添加此代码

override func shouldPerformSegueWithIdentifier(identifier: String, sender: AnyObject?) -> Bool {
    return false;
}

答案 1 :(得分:0)

@GerwazySokołowski

检查故事板中的xib文件。我认为你从按钮或任何其他视图链接segue。应该使用UIViewcontroller设置segue,然后可以调用performSegueWithIdentifier