在 Segue 之前初始化 ViewController

Posted

技术标签:

【中文标题】在 Segue 之前初始化 ViewController【英文标题】:Initialising a ViewController before Segue 【发布时间】:2015-07-19 07:44:15 【问题描述】:

我正在对需要初始化过程的视图控制器执行 segue。目前初始化发生在目标视图控制器的 ViewDidLoad 中。然而,初始化相当长,我想在它发生时显示一个微调器。

如果我在 ViewDidLoad 中创建 UIActivityIndi​​catorView 并在另一个线程上运行初始化,当然 ViewDidLoad 会退出并且加载过程的其余部分会发生 - 特别是 shouldAutorotate 被调用,其中包含假设初始化过程已经发生的代码。 (即使没有,我也不想在初始化之前显示目标视图。)

答案似乎是在调用 segue 之前初始化目标视图控制器。但是我不能在调用视图控制器的 prepareForSegue 中这样做,出于同样的原因 - 它退出并且在初始化发生之前调用 segue。

所以我似乎需要实例化目标控制器,初始化它,然后以初始化的控制器作为目标执行 segue。我的问题是我不知道该怎么做。我遇到的唯一可能的方法是将 UIStoryboardSegue 子类化并将初始化放在子类的 init 中。然后我假设我打电话

UIStoryboardSegue * segue = [[SubclassedSegue alloc]initWithIdentifier:@"??what should this be??" source:self destination:targetViewContoller];
[segue perform];    // which just calls [super perform];

来自源视图控制器。它是否正确?谁能给我看一些使用这个过程的示例代码 - 或者最好是我没有想到的更简单的方法?我不禁想到必须有一种更简单的方法来显示微调器。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

仅当您需要在转场期间显示自定义动画/过渡时,才应将转场子类化。

在通常情况下,您会希望这样做:

__ block Destination *destinationVC = [self.storyboard instantiateViewControllerWithIdentifier:@"destination "];

    //START BUSY CURSOR HERE
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), 
    ^
        // init whatever you want for destinationVC HERE.
        dispatch_async(dispatch_get_main_queue(), 
      ^
        //STOP BUSY CURSOR 
       //PERFORM UI UPDATE HERE
       [self presentViewController:destinationVC animated:YES completion:nil];
    );

【讨论】:

+1: 这也是一种方式 :) 我会将加载指示器保留在destinationVC 上,但这是 OP 要求的(仍然不认为这很好 :D) 是的,我也有点惊讶为什么要从源代码启动 destVC。 谢谢——所以我们只使用了presentViewController,根本没有使用segue? [注意 - 我最初是在目标 VC 上进行初始化,但在初始化之前(当微调器显示时)它只是一个空白屏幕。同样正如我所说,如果在初始化之前调用 shouldAutoRotate 中的代码会导致崩溃,如果视图显示得太早,就会导致崩溃。] 你也可以使用导航控制器的pushviewcontroller方法。 好的,谢谢尼拉夫。答案似乎是我不能在使用故事板中的 segue 时做到这一点 - 或者至少在不弄乱我不应该弄乱的东西的情况下不能这样做。只需实例化 VC,初始化,设置 modalTransitionStyle 并调用 presentViewController。【参考方案2】:

只要让destinationViewController 总是添加一个activityIndi​​cator 并在viewWillAppear 中.. 如果你不再需要它就隐藏它

或者在prepareForSegue中将一个标志传递给destinationViewController。

您不需要继承 UISegue!

【讨论】:

以上是关于在 Segue 之前初始化 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

按下时 Segue 不会显示 ViewController

iOS开发之点击tableViewCell,显示详情

XCODE:2 个视图控制器连接一个 segue 和 2 个 Uilabels 数据

在没有底层闪存的情况下,如何在视图出现之前执行Segue?

在不显示标签栏的情况下执行对另一个导航控制器的 segue

iAd 横幅在 segue 上变白