我正在尝试以编程方式将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}}是零。所以什么都没做。
答案 0 :(得分:7)
对任何可能仍有同样问题的人。
我有类似的情况,只需调用loadViewIfNeeded()即可解决它。
let sb: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let controller = sb.instantiateViewControllerWithIdentifier("LoadingView") as! LoadingViewController
controller.loadViewIfNeeded()
然后我可以访问视图中的所有内容。
答案 1 :(得分:1)
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