instantiateViewControllerWithIdentifier似乎调用viewdidload
我正尝试将ViewController以编程方式推送到导航控制器中,然后使用我的故事板创build它。
这里是我的代码:
+ (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
等于零。
我以为在pushViewController
方法中调用MyViewController viewDidLoad
。
任何想法为什么viewDidLoad
在instantiateViewControllerWithIdentifier
期间被调用?
—更新:—
在这里我的viewDidLoad
- (void)viewDidLoad { for (MyItem *currentItem in self.items[0]) { [Do Something] } [super viewDidLoad]; [...] }
self.items
是零。 所以没有做任何事情。
对任何人可能仍然有相同的问题。
我有类似的情况,并通过调用loadViewIfNeeded()来解决它。
let sb: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) let controller = sb.instantiateViewControllerWithIdentifier("LoadingView") as! LoadingViewController controller.loadViewIfNeeded()
我可以访问视图内的所有内容。
请参阅: 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
。
正如voyage11所提到的,当控制器的视图被加载到内存中时,viewDidLoad被调用,尽pipe有人指出在instantiateViewControllerWithIdentifier方法中不一定会发生这种情况。
遵循你的示例代码,我把这个循环放在viewWillAppear方法中:
- (void) viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // good practice to call the super for (MyItem *currentItem in self.items[0]) { [Do Something] } }
您可以尝试使用“[self loadViewIfNeeded]” 为obj-c或“self.loadViewIfNeeded()” 为swift ; 'self'=你的ViewController
apple:loadViewIfNeeded