我刚刚意识到以下代码总是会创建一个新的TagsFeedViewController。这是segues的默认行为吗?有没有办法配置iOS每次都不创建新的destinationViewController?
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"showSearchResult"]) {
TagsFeedViewController *destViewController = segue.destinationViewController;
destViewController.query = query;
}
}
答案 0 :(得分:17)
Segues使用为其– initWithIdentifier:source:destination:
方法提供的视图控制器。它不是创建目标视图控制器的segue,而是故事板。来自the docs:
通常,故事板中的视图控制器会被实例化 自动创建以响应在...中定义的操作 故事板本身。
所以你有一些选择:
子类UIStoryboard。可能是一个坏主意。 UIStoryboard的公共接口只有三种方法; “故事板本身定义的行为”不公开,我认为没有足够的信息可以让你做正确的工作。
让您的目标视图控制器成为单身人士。也是一个坏主意。除了general badness that singletons bring with them之外,您不需要保留一个没有视图且没有子视图控制器的视图控制器。并且让你的视图控制器类只是为了欺骗UIStoryboard使用你的视图控制器类的特定实例似乎有点蠢。
子类UIStoryboardSegue。如果您创建自己的segues,您可以在– initWithIdentifier:source:destination:
中执行您喜欢的操作,包括忽略提供的目标视图控制器并使用您想要的那个。这似乎仍然违背框架,这通常是一个糟糕的计划,但如果你绝对必须使用目标视图控制器的特定实例,这似乎是一个更好的方法。
顺其自然。最佳选择。想想你希望转向现有视图控制器的原因。考虑是否有更好的方法来实现您想要的而不必破坏框架。例如,您是否要使用现有的视图控制器,因为它已经具有某种特定的状态?也许最好在模型中维护该状态而不是在视图控制器中。
答案 1 :(得分:1)
是的,这是segues的默认行为。有关详细信息,请参阅此post。
答案 2 :(得分:0)
您可以通过处理shouldPerformSegueWithIdentifier:sender:消息来阻止创建控制器。
-(BOOL) shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
{
if ([identifier isEqualToString:@"showSearchResult"]) {
return [self.results count] > 0;
}
return YES;
}