Ios InstanceEviewController标识符似乎调用viewdidload
我试图以编程方式将ViewController推入导航控制器,并使用我的故事板创建它 这是我的密码:Ios InstanceEviewController标识符似乎调用viewdidload,ios,objective-c,storyboard,instantiation,viewdidload,Ios,Objective C,Storyboard,Instantiation,Viewdidload,我试图以编程方式将ViewController推入导航控制器,并使用我的故事板创建它 这是我的密码: + (void) pushViewController:(NSString *) identifier ForItems:(NSMutableArray *) items sender:(UIViewController *) sender { GenericViewController *viewController = (GenericViewController *)[sender
+ (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
中,我正在使用我的项目
。由于一些断点,我看到GenericViewController viewdiload
仅在instantialeviewcontrollerwhidentifier
之后,items等于nil
我认为在pushViewController
方法期间调用了MyViewController viewDidLoad
您知道为什么在实例化过程中调用viewDidLoad
吗
--更新:---
这里是我的viewDidLoad
- (void)viewDidLoad
{
for (MyItem *currentItem in self.items[0]) {
[Do Something]
}
[super viewDidLoad];
[...]
}
self.items
为零。所以什么也没做。参见:
当控制器的视图加载到内存中时,调用viewDidLoad
视图将出现
通知视图控制器其视图即将添加到视图层次结构中。我认为这是当[self.navigationController推viewController:viewController动画:是]代码>被调用
viewdide出现
通知视图控制器其视图已添加到视图层次结构中。这是当MyViewController
被添加到navigationController
中时,正如voyage11所提到的,当控制器的视图加载到内存中时调用viewDidLoad,尽管有人指出,这不一定在实例化EviewController WithiIdentifier方法期间发生
按照您的示例代码,我将把循环放在viewWillExample方法中:
- (void) viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated]; // good practice to call the super
for (MyItem *currentItem in self.items[0]) {
[Do Something]
}
}
给任何可能仍然有同样问题的人
我遇到了类似的情况,只需调用loadViewIfNeeded()即可解决
然后,我可以访问视图中的所有内容。您可以在Objective-C中使用[vc loadViewIfNeeded]
,或者在Swift中使用vc.loadViewIfNeeded()
请输入完整的代码..什么是myItem和viewDidLoad方法..问题不在于此..因为当您启动一个对象时,它是活动的。您需要提供更多信息。显示使用InstanceViewController WithiIdentifier:的整个方法。InstanceEviewController WithiIdentifier:方法不会导致调用viewDidLoad,因此会发生其他情况。谢谢@rdelmar我非常确定InstanceEviewController WithiIdentifier
不要调用viewDidLoad
。我更新了我的代码,我正在使用静态管理器实例化并推送我的新viewControllerI我仍然没有在您发布的代码中看到任何会导致在推送之前调用viewDidLoad的内容。您是否有到GenericViewController的任何segues设置?GenericViewController是一个独立的控制器吗(没有嵌入任何东西)?这是有道理的,但问题表明它是一种将属性传递给视图控制器的好方法。(,)您的初始语句不正确--viewDidLoad不会仅通过实例化视图控制器来调用。这一点很好。我已经更新了我的答案,以消除这种暗示。正如文档所述,永远不应该直接调用loadView()。
let sb: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let controller = sb.instantiateViewControllerWithIdentifier("LoadingView") as! LoadingViewController
controller.loadViewIfNeeded()