instantiateViewControllerWithIdentifier似乎调用了viewdidload

时间:2014-05-05 13:57:50

标签: ios objective-c storyboard instantiation viewdidload

我正在尝试以编程方式将ViewController推送到导航控制器,而我正在使用我的故事板来创建它。

这是我的代码:

+ (void) pushViewController:(NSString *) identifier ForItems:(NSMutableArray *) items sender:(UIViewController *) sender {
    GenericViewController *viewController = (GenericViewController *)[sender.storyboard instantiateViewControllerWithIdentifier:identifier];

    viewController.items = [[NSMutableArray alloc] init];
    [viewController.items removeAllObjects];
    [viewController.items addObject:[[NSMutableArray alloc] init]];
    [viewController.items[0] addObjectsFromArray:items];

    [sender.navigationController pushViewController:viewController animated:YES];
}

GenericViewController viewDidLoad我正在使用我的items。感谢一些断点,我看到GenericViewController viewDidLoad instantiateViewControllerWithIdentifier之后items MyViewController viewDidLoad等于零。

我认为在pushViewController方法中调用viewDidLoad

知道为什么在instantiateViewControllerWithIdentifier期间调用viewDidLoad

---更新:---

这是我的- (void)viewDidLoad { for (MyItem *currentItem in self.items[0]) { [Do Something] } [super viewDidLoad]; [...] }

self.items

{{1}}是零。所以什么都没做。

4 个答案:

答案 0 :(得分:7)

对任何可能仍有同样问题的人。

我有类似的情况,只需调用loadViewIfNeeded()即可解决它。

let sb: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let controller = sb.instantiateViewControllerWithIdentifier("LoadingView") as! LoadingViewController
controller.loadViewIfNeeded()

然后我可以访问视图中的所有内容。

答案 1 :(得分:1)

请参阅:https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/viewDidLoad

当控制器的视图加载到内存中时,会调用

viewDidLoad

viewWillAppear通知视图控制器其视图即将添加到视图层次结构中。我认为这是在调用[self.navigationController pushViewController:viewController animated:YES];时。

viewDidAppear通知视图控制器其视图已添加到视图层次结构中。这是MyViewController添加navigationController的时候。

答案 2 :(得分:0)

正如voyage11所提到的,当控制器的视图被加载到内存中时会调用viewDidLoad,尽管有人指出这不一定会在instantiateViewControllerWithIdentifier方法中发生。

按照您的示例代码,我将循环放在viewWillAppear方法中:

- (void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];  // good practice to call the super
    for (MyItem *currentItem in self.items[0]) {
        [Do Something]
    }
}

答案 3 :(得分:0)

您可以尝试使用" [self loadViewIfNeeded]" for obj-c 或" self.loadViewIfNeeded()" for swift ; '自' =您的ViewController

apple: loadViewIfNeeded