【问题标题】:viewDidLoad() of segue.destinationViewController called twice before prepareForSegue()segue.destinationViewController 的 viewDidLoad() 在 prepareForSegue() 之前调用了两次
【发布时间】:2016-06-20 21:26:36
【问题描述】:

所以我要做的是通过 didSelectRowAtIndexPath 中 prepareForSegue 方法的 sender 参数将对象从 tableViewController 发送到 collectionViewController,但由于某种原因,该 collectionViewController 的 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 被调用

我不知道为什么会发生这种情况,不胜感激。

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

【问题讨论】:

    标签: ios iphone uiviewcontroller uistoryboardsegue


    【解决方案1】:

    您必须从单元格而不是整个控制器中获取 segue,以便执行两次 segue

    请从 Controller 中获取 segue 然后尝试

    添加此代码

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

    【讨论】:

    • 对不起,忘了提 - segue 是从 viewController 触发的,因此 sender 参数是设置的“挑战”对象,而不是单元格。所以恐怕不是这样。
    • 如果使用 performSegueWithIdentifier,则不会调用 IIRC shouldPerformSegueWithIdentifier。还是试了一下,还是没用,谢谢。
    【解决方案2】:

    @Gerwazy Sokołowski

    在情节提要中检查您的 xib 文件。我认为您将 segue 从按钮或任何其他视图链接。 segue 应该用 UIViewcontroller 设置然后你可以调用 performSegueWithIdentifier

    【讨论】:

    • 双重检查 - segue 肯定是从 viewController 本身触发的,而不是单元格或任何其他子视图。
    猜你喜欢
    • 2014-07-16
    • 2013-02-15
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多