6

我刚刚意识到下面的代码总是会创建一个新的 TagsFeedViewController。这是 segues 的默认行为吗?有没有办法将 iOS 配置为不每次都创建新的destinationViewController?

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"showSearchResult"]) {
        TagsFeedViewController *destViewController = segue.destinationViewController;
        destViewController.query = query;
    }
}
4

3 回答 3

17

Segue 使用为其– initWithIdentifier:source:destination:方法提供的任何视图控制器。创建目标视图控制器的不是 segue,而是故事板。从文档

通常,故事板中的视图控制器会自动实例化和创建,以响应故事板本身中定义的操作。

所以你有一些选择:

  • 子类 UIStoryboard。可能是个坏主意。UIStoryboard 的公共接口只有三个方法;“情节提要本身中定义的动作”不公开,我认为没有足够的信息可以让您正确完成工作。

  • 使您的目标视图控制器成为单例。也是个坏主意。除了单例带来的普遍不良影响之外,您不需要保留一个没有视图和子视图控制器的视图控制器。并且让您的视图控制器类成为单例只是为了欺骗 UIStoryboard 使用您的视图控制器类的特定实例似乎有点恶心。

  • 子类 UIStoryboardSegue。如果你创建自己的 segue,你可以做你喜欢的事情– initWithIdentifier:source:destination:,包括忽略提供的目标视图控制器并使用你想要的。这似乎仍然违反框架,这通常是一个糟糕的计划,但如果您绝对必须使用目标视图控制器的特定实例,这似乎是一个更好的方法。

  • 顺其自然。最佳选择。考虑一下您希望继续使用现有视图控制器的原因。考虑是否有更好的方法来完成你想要的,而不必颠覆框架。例如,您是否想使用现有的视图控制器,因为它已经具有某些特定状态?也许最好在模型中而不是在视图控制器中维护该状态。

于 2013-04-08T01:02:09.440 回答
1

是的,这是 segues 的默认行为。有关更多信息,请参阅此帖子

于 2013-04-07T23:50:42.583 回答
0

您可以通过处理shouldPerformSegueWithIdentifier:sender:消息来阻止创建控制器。

-(BOOL) shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender 
{
    if ([identifier isEqualToString:@"showSearchResult"]) {
       return [self.results count] > 0;
    }
    return YES;
}
于 2013-04-08T07:17:14.710 回答