【问题标题】:prepareForSegue **always** creates a new destinationViewController?prepareForSegue **总是** 创建一个新的destinationViewController?
【发布时间】:2013-03-29 22:44:58
【问题描述】:

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

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

【问题讨论】:

  • 是的,除了 unwind segues 之外的所有 segues 都会创建视图控制器 - 但是如果不创建视图控制器,您使用 segues 做什么?

标签: ios objective-c uistoryboard uistoryboardsegue


【解决方案1】:

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

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

所以你有一些选择:

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

  • 让您的目标视图控制器成为单例。 这也是个坏主意。除了general badness that singletons bring with them,您不需要保留一个没有视图和子视图控制器的视图控制器。并且让您的视图控制器类成为单例只是为了欺骗 UIStoryboard 使用您的视图控制器类的特定实例似乎有点恶心。

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 链接不再有效
    【解决方案3】:

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

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

    【讨论】:

    • 似乎通过阻止执行 segue 来阻止创建控制器。我认为这不是 OP 想要完成的。
    • @Caleb 我可能误解了这个问题,但我认为没有理由在没有控制器的情况下执行 segue(除非它当然是放松)
    • 我认为 OP 希望使用 segue 来呈现现有的视图控制器,而不是每次都创建一个新的。
    • 我明白了。那么我猜他/她不应该使用segues。
    猜你喜欢
    • 2014-05-25
    • 2023-04-03
    • 1970-01-01
    • 2019-09-20
    • 2016-04-30
    • 2016-06-09
    • 2018-08-31
    • 2022-12-06
    • 1970-01-01
    相关资源
    最近更新 更多