我有一个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];
}
现在,我的问题是segue.desinationViewController
返回nil
(正如代码段中的评论所示)。
只是为了调试,我将UINavigationController
更改为另一个视图控制器,我没有问题。我不知道从过渡样式转换到过渡样式是否会有所帮助,因为它不可能推动UINavigationController
(发生崩溃事件就是这样)。
我清理了项目和构建文件夹并重新启动了我的计算机(以及Xcode)。
这是运行应用程序时的样子:
在搜索类似问题时,我发现了这一点。大多数其他问题是关于在目标视图控制器上设置的属性为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];
这很有效。所以我认为问题出在故事板上。
答案 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
}
此链接可以帮助我:
答案 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
复选框