在Segue

时间:2015-07-19 07:44:15

标签: ios objective-c uistoryboardsegue

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

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

答案似乎是在调用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];
来自源视图控制器的

。它是否正确?任何人都可以告诉我一些使用这个过程的示例代码 - 或者最好是一个我没想过的简单方法吗?我不禁想到必须有一种更简单的方式来展示一个微调器。

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

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

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

__ 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 :(得分:1)

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

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

您不应该将UISegue继承为子类!