2013-04-07 19 views
6

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

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

是的所有segues,除了unwind segues创建viewcontrollers - 但是你用什么segues,如果不是创建一个视图控制器? – 2013-04-08 00:04:20

回答

1

是的,这是segues的默认行为。有关更多信息,请参见post

+0

该链接不再有效 – CupawnTae 2017-08-01 10:54:17

17

Segues使用任何视图控制器提供给它们的– initWithIdentifier:source:destination:方法。创建目标视图控制器的不是segue,而是故事板。从the docs

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

所以,你有一些选择:

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

  • 使您的目标视图控制器成为一个单身人士。也是一个坏主意。除了general badness that singletons bring with them之外,你不需要保留一个没有视图并且没有子视图控制器的视图控制器。并且让你的视图控制器类成为一个单例只是为了欺骗UIStoryboard使用你的视图控制器类的特定实例,看起来有点儿。。

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

  • 请随流。最好的选择。想想你希望延续到现有视图控制器的原因。考虑是否有更好的方法来实现你想要的而不必颠覆框架。例如,你是否想使用现有的视图控制器,因为它已经有一些特定的状态?也许最好是在模型中保持这种状态,而不是在视图控制器中。

0

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

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

似乎这样可以防止通过阻止执行继续来创建控制器。我不认为这是OP想要完成的。 – Caleb 2013-04-09 06:03:28

+0

@Caleb我可能误解了这个问题,但是我没有理由在没有控制器的情况下执行segue(当然,除非它是放松) – Tassos 2013-04-09 07:14:16

+1

我认为OP想要使用segue来呈现现有的视图控制器,而不是创建新的每次一个。 – Caleb 2013-04-09 07:20:33