prepareForSegue **总是**创build一个新的destinationViewController?

我只是意识到,下面的代码总是创build一个新的TagsFeedViewController。 这是segues的默认行为吗? 有没有办法configurationiOS不创build一个新的destinationViewController每次?

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

Segges使用提供给它们的任何视图控制器– initWithIdentifier:source:destination:方法。 创build目标视图控制器的不是segue,而是storyboard。 从文档 :

通常情况下,故事板中的视图控制器被自动实例化和创build,以响应故事板本身内定义的动作。

所以你有一些select:

  • 子类UIStoryboard。 可能是个坏主意。 UIStoryboard的公共接口只有三种方法; “故事板本身定义的动作”并不是公开的,我不认为有足够的信息可以让你做正确的工作。

  • 使你的目标视图控制器是一个单身人士。 也是一个坏主意。 除了单身人士带来的一般不愉快之外,你不应该保留一个没有视图和没有子视图控制器的视图控制器。 并使您的视图控制器类单身只是欺骗UIStoryboard使用视图控制器类的特定实例似乎有点icky。

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

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

是的,这是segues的默认行为。 看到这个职位了解更多信息。

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

 -(BOOL) shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender { if ([identifier isEqualToString:@"showSearchResult"]) { return [self.results count] > 0; } return YES; }