当呈现UINavigationController模态时,segue.destinationViewController为nil

时间:2015-06-07 15:35:07

标签: ios xcode uistoryboardsegue

我有一个UICollectionView,当用户按下一个单元格时,我会使用故事板以UINavigationController模式呈现另一个视图控制器。

- (void)collectionView:(UICollectionView *)collectionView
didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    [self performSegueWithIdentifier:@"editBookIPad"
                                      sender:indexPath];
}


- (void)prepareForSegue:(UIStoryboardSegue *)segue
                 sender:(id)sender
{
    // Did not include code for other segues, but I check which is the current one properly
    UINavigationController *dest = segue.destinationViewController; // This is nil!
    dest.modalPresentationStyle = UIModalPresentationFormSheet;
    DetailsViewController *detailsVC = (id)[dest topViewController];
    detailsVC.stack = self.stack;
    detailsVC.editingMode = 1;
    detailsVC.bookToEdit = [self.fetchedResultsController objectAtIndexPath:sender];
    [self.collectionView deselectItemAtIndexPath:sender
                                        animated:YES];
}

Storyboard

现在,我的问题是segue.desinationViewController返回nil(正如代码段中的评论所示)。

只是为了调试,我将UINavigationController更改为另一个视图控制器,我没有问题。我不知道从过渡样式转换到过渡样式是否会有所帮助,因为它不可能推动UINavigationController(发生崩溃事件就是这样)。

我清理了项目和构建文件夹并重新启动了我的计算机(以及Xcode)。

这是运行应用程序时的样子:

Screenshot of problem

在搜索类似问题时,我发现了这一点。大多数其他问题是关于在目标视图控制器上设置的属性为nil(例如this)。

我使用Xcode 5.1.1并将iOS 7.0作为开发目标。

EDIT1

现在我的应用程序的所有部分都出现了同样的问题(模拟地呈现了UINavigationController的所有部分)。 然而,只会在某些情况下发生,但每次segue.destinationViewController仍然是nil

EDIT2

我用此替换了prepareForSegue代码(手动执行):

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard"
                                                     bundle:nil];
UINavigationController *navCon = [storyboard instantiateViewControllerWithIdentifier:@"AllBooksVCDetails"]; // The problematic navigation controller
navCon.modalPresentationStyle = UIModalPresentationFormSheet;
BKSBookDetailsViewController *detailsVC = (id)[navCon topViewController];
detailsVC.stack = self.stack;
detailsVC.editingMode = 1;
detailsVC.bookToEdit = [self.fetchedResultsController objectAtIndexPath:indexPath];
[self presentViewController:navCon
                   animated:YES
                 completion:nil];
[self.collectionView deselectItemAtIndexPath:indexPath
                                    animated:YES];

这很有效。所以我认为问题出在故事板上。

5 个答案:

答案 0 :(得分:10)

在将NavigationController嵌入到NavigationController中时,我遇到了同样的问题。

 override public func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

        let destinationVC = segue.destinationViewController as! UINavigationController
        let nextViewController = destinationVC.viewControllers[0] as! SecondViewController

        nextViewController.someProperty = someValue
    }

此链接可以帮助我:

https://www.andrewcbancroft.com/2015/06/02/access-sub-controllers-from-a-uinavigationcontroller-in-swift/

答案 1 :(得分:8)

我也使用swift遇到过这个问题,但是1小时后,我发现使用发送者 .destinationViewController而不是 segue .destinationViewController。 你确定你使用的是segue而不是发件人吗?

答案 2 :(得分:2)

问题是在UINavigationController中嵌入UIViewController。 S. Matsepura的一个变种回答了" ShowView"是segue的标识符(如果你有多个):

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "ShowView" {
        if let nc = segue.destination as? UINavigationController, let vc = nc.topViewController as? MyViewController {
            vc.var = "value"
        }
    }
}

答案 3 :(得分:0)

我遇到了同样的问题,我认为问题是将viewcontroller嵌入到NavigationController中。我删除导航控制器后,prepareForSegue按预期工作,segue.destinationViewController开始返回正确的viewController类。

只想将其添加为信息。

所以我的问题是segue.destinationViewController将nil传递给self.preboardingViewController:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "GoToPreBoarding" {


        self.preboardingViewController = segue.destinationViewController as? PreBoardingViewController
        self.preboardingViewController?.myShiftViewController = self
    }
}

所以在swift中,我解决了与你的问题几乎相同的问题,让导航控制器topviewController让我失望了一下。这是我的解决方案:

let storyboard = UIStoryboard(name: "PreBoarding", bundle: nil)
        let navCon = storyboard.instantiateViewControllerWithIdentifier("PreBoardingNavigation") as! UINavigationController
        navCon.modalPresentationStyle = UIModalPresentationStyle.FormSheet
        self.preboardingViewController = navCon.topViewController as? PreBoardingViewController
        self.preboardingViewController?.myShiftViewController = self
        self.presentViewController(navCon, animated: true, completion: nil)

答案 4 :(得分:0)

还要确保在情节提要的Destination ViewController类中,启用类的Identity Inspector下的Inherit Module From Target复选框