在 Segue 之前初始化一个 ViewController

Initialising a ViewController before Segue

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

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

答案似乎是在调用 segue 之前初始化目标视图控制器。但是,出于同样的原因,我无法在调用视图控制器的 prepareForSegue 中执行此操作 - 它退出并在初始化发生之前调用 segue。

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

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

来自源视图控制器。这个对吗?谁能给我看一些使用这个过程的示例代码——或者最好是我没有想到的更简单的方法?我忍不住想一定有更简单的方法来显示微调器。

感谢您的帮助。

仅当您需要在转场期间显示自定义 animation/transition 时才应将转场子类化。

在通常情况下,您会想要这样做:

__ 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];
    });

只需让 destinationViewController 始终添加一个 activityIndi​​cator 并在 viewWillAppear 中......如果您不再需要它,只需将其隐藏

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

您不需要继承 UISegue!