在 Segue 之前初始化 ViewController
Posted
技术标签:
【中文标题】在 Segue 之前初始化 ViewController【英文标题】:Initialising a ViewController before Segue 【发布时间】:2015-07-19 07:44:15 【问题描述】:我正在对需要初始化过程的视图控制器执行 segue。目前初始化发生在目标视图控制器的 ViewDidLoad 中。然而,初始化相当长,我想在它发生时显示一个微调器。
如果我在 ViewDidLoad 中创建 UIActivityIndicatorView 并在另一个线程上运行初始化,当然 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 总是添加一个activityIndicator 并在viewWillAppear 中.. 如果你不再需要它就隐藏它
或者在prepareForSegue中将一个标志传递给destinationViewController。
您不需要继承 UISegue!
【讨论】:
以上是关于在 Segue 之前初始化 ViewController的主要内容,如果未能解决你的问题,请参考以下文章