在 Segue 之前初始化一个 ViewController
Initialising a ViewController before Segue
我正在对需要初始化过程的视图控制器执行转接。目前初始化发生在目标视图控制器的 ViewDidLoad 中。然而,初始化过程相当冗长,我想在它发生时展示一个微调器。
如果我在 ViewDidLoad 中创建一个 UIActivityIndicatorView 并且 运行 在另一个线程上初始化,当然 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 始终添加一个 activityIndicator 并在 viewWillAppear 中......如果您不再需要它,只需将其隐藏
或者在 prepareForSegue 中将标志传递给 destinationViewController。
您不需要继承 UISegue!
我正在对需要初始化过程的视图控制器执行转接。目前初始化发生在目标视图控制器的 ViewDidLoad 中。然而,初始化过程相当冗长,我想在它发生时展示一个微调器。
如果我在 ViewDidLoad 中创建一个 UIActivityIndicatorView 并且 运行 在另一个线程上初始化,当然 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 始终添加一个 activityIndicator 并在 viewWillAppear 中......如果您不再需要它,只需将其隐藏
或者在 prepareForSegue 中将标志传递给 destinationViewController。
您不需要继承 UISegue!