故事板 Segue 未加载视图
Posted
技术标签:
【中文标题】故事板 Segue 未加载视图【英文标题】:Storyboard Segue not loading view 【发布时间】:2012-06-26 20:33:19 【问题描述】:我正在尝试在代码中进行搜索。 prepareForSegue 函数运行并显示正确的目标视图控制器,但没有任何反应。关于我缺少什么或配置错误的任何想法?
查看控制器可能路径:
A ->B (sgueResultat)
or
A->C (sgueStopSplash)
选择转场的代码:
if (proversion)
[self performSegueWithIdentifier:@"sgueResultat" sender:self];
else
[self performSegueWithIdentifier:@"sgueStopSplash" sender:self];
`
我可以确认的 prepareForSegue 正在由 NSLog 运行:
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
NSLog(@"Source Controller = %@", [segue sourceViewController]);
NSLog(@"Destination Controller = %@", [segue destinationViewController]);
NSLog(@"Segue Identifier = %@", [segue identifier]);
Nslog 输出:
2012-06-26 22:22:26.002 ClosetV2[2333:fb03] Source Controller = <ABStartViewController: 0xeb12270>
2012-06-26 22:22:26.002 ClosetV2[2333:fb03] Destination Controller = <SplashAfterStopViewController: 0x6b2c9e0>
2012-06-26 22:22:26.003 ClosetV2[2333:fb03] Segue Identifier = sgueStopSplash
2012-06-26 22:22:26.003 ClosetV2[2333:fb03] sgueStopSplash
问候 安德烈亚斯
【问题讨论】:
segue 的配置是做什么的?如果配置为“推送”,源视图控制器是否嵌入在导航控制器中? 两个 Segue 都设置为 Modal。 segues 是否以其他方式配置?另外,第四个日志输出行是什么?它不包含在您包含的prepareForSegue:sender:
的代码 sn-p 中。
如果将日志语句放在SplashAfterStopViewController
的initWithCoder:
、awakeFromNib
、viewDidLoad:
或viewWillAppear:
方法中会发生什么?
David:第四行日志在 prepareForSegue 中:if ([[segue identifier] isEqualToString:@"sgueStopSplash"]) NSLog(@"sgueStopSplash");
【参考方案1】:
确保您的故事板中的转场设置为“模态”(如果您喜欢,也可以自定义)。
我记得当故事板问世时我第一次开始使用 segues 时,我一直在尝试使用推送,只有当你有一个嵌入式 UINavigationController 时你才能做到这一点。否则,push segue 将根本不起作用。
另一个想法……下面的代码在哪里执行?如果动画已经发生或者当前视图没有显示在屏幕上,它就不能正常工作。例如,如果您的 viewDidLoad 中有此代码,它将无法正常工作。
if (proversion)
[self performSegueWithIdentifier:@"sgueResultat" sender:self];
else
[self performSegueWithIdentifier:@"sgueStopSplash" sender:self];
编辑:更新答案
在执行 segue 之前等待 [selfdismissModalViewController:YES] 动画完成实际上很烦人并且有些混乱。我认为没有“正确”的方法可以做到这一点。但是,如果您将以下方法放在具有模态控制器的视图中,并在使用 [self dismissModalViewController:YES] 后向其发送消息,您应该处于良好状态。
- (void)waitUntilModalControllerIsDismissed
if(self.modalViewController)
[self performSelector:@selector(waitUntilModalControllerIsDismissed:)
withObject:nil
afterDelay:0.1f];
return;
else
//At this point, the modal animation will be completed and you can perform your segue if you want
【讨论】:
这可能发生在某些动作中,例如按钮点击、手势或设备晃动。那会更合理。 (但仍然只是猜测) 动画可能正在发生,因为我有一个 [self dismissModalViewControllerAnimated:YES];,确认!更改为 NO 解决了问题。有什么方法可以等待动画完成? 更新了我的答案,包括如何在执行 segue 之前等待模态动画。以上是关于故事板 Segue 未加载视图的主要内容,如果未能解决你的问题,请参考以下文章
使用 Parse.com 的多个 Segue 故事板和 TableViewCell
UIViewController _loadViewFromNibNamed:bundle 加载了“XXXViewController”笔尖,但未设置视图出口。 -*使用故事板*