等待 instantiateViewControllerWithIdentifier 完成

Waiting the finish of instantiateViewControllerWithIdentifier

我有一个情节提要并从如下代码实例化一个视图控制器:

NSLog(@"1");
MyController *vc = (MyController *)[[UIStoryboard storyBoardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"MyController"];
NSLog(@"4");

MyController class 的实现包括以下内容:

- (void)viewDidLoad {
    NSLog(@"2");
    [super viewDidLoad];
    [NSThread sleepForTimeInterval:2];
    NSLog(@"3");
}

我希望在 运行 我的代码时看到以下输出:

1
2
3
4

但似乎 -viewDidLoad 在我访问 MyController 的视图之前甚至没有被调用:

1
4

如果我这样修改第一个:

NSLog(@"1");
MyController *vc = (MyController *)[[UIStoryboard storyBoardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"MyController"];
[vc view]; // Just accessing
NSLog(@"4");

那么它的输出将是:

1
4
2
3

我如何确定我的属性已初始化 (-viewDidLoad 运行) 并且我可以为我的控制器提供参数?推荐的方法是什么?

这是因为 viewDidLoad 仅在您以模态方式呈现视图控制器或推送到导航控制器或以某种方式显示它之后调用。 所以如果你想收到1,2,3,4,你需要这样的东西:

NSLog(@"1");
MyController *vc = (MyController *)[[UIStoryboard storyBoardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"MyController"];
[self presentViewController:vc animated:YES completion:^{
    NSLog(@"4");
}];

您应该编写 VC,这样无论在设置属性之前还是之后加载视图都没有关系。

如果你有这样的属性:

@property (nonatomic, copy) NSString *superAwesomeLabelText;

而你需要设置你的超赞标签的文字,有以下几点:

viewDidLoad

self.superAwesomeLabel.text = (self.superAwesomeLabelText) ?: @"Default lame text";

setter为superAwesomeLabelText:

- (void)setSuperAwesomeLabelText:(NSString*)superAwesomeLabelText {
    _superAwesomeLabelText = [superAwesomeLabelText copy];

   self.superAwesomeLabel.text = superAwesomeLabelText;
}

现在在设置 属性 之前或之后加载视图并不重要。