等待instantiateViewControllerWithIdentifier的完成

时间:2015-11-09 23:20:40

标签: ios objective-c uiviewcontroller storyboard

我有一个Storyboard并从这样的代码中实例化一个视图控制器:

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

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

- (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已运行)并且我可以为控制器提供参数?建议的方法是什么?

2 个答案:

答案 0 :(得分:1)

这是因为只有在您以模态方式呈现视图控制器或推送到导航控制器或以某种方式显示它之后才会调用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");
}];

答案 1 :(得分:1)

您应该编写VC,以便在设置属性之前或之后加载视图无关紧要。

如果你有这样的财产:

@property (nonatomic, copy) NSString *superAwesomeLabelText;

您需要设置超级棒标签的文本,具有以下内容:

viewDidLoad

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

superAwesomeLabelText的设定者:

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

   self.superAwesomeLabel.text = superAwesomeLabelText;
}

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