Jus*_*cle 31 iphone cocoa-touch uiviewcontroller uiview
作为新的可可,我遇到的几个问题Interface Builder,UIViewController和朋友.
我有一个在xib中定义的UIViewController子类UIView,并且控制器的视图插座连接到视图.xib的"文件所有者"被设置为myViewcontroller子类.
在这一个实例中,以下用于加载控制器/视图的代码(来自主视图控制器)无法按预期工作:
if ( self.myViewController == nil )
{
self.myViewController = [[MyViewController alloc]
initWithNibName:@"MyViewController" bundle:nil];
}
[self.navigationController
pushViewController:self.myViewController animated:YES];
Run Code Online (Sandbox Code Playgroud)
在MyViewController的方法中,我放置了断点和日志消息以查看发生了什么:
-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
NSLog(@"initWithNibName\n");
}
return self;
}
-(void)viewDidLoad {
[super viewDidLoad];
NSLog(@"viewDidLoad\n");
}
Run Code Online (Sandbox Code Playgroud)
预期结果
调用两者-initWithNibName和-viewDidLoad方法,并显示myViewController的视图.
观察结果
仅-initWithNibName调用,不显示视图.
我错过了什么吗?任何人都可以推荐任何检查?(特别是在奇妙的不透明Interface Builder工具中).
Jad*_*ijo 33
RE:解决方案!!!!!
确实这似乎是一个有效的解决方案,但真正的诀窍不是将view.hidden属性设置为NO,是什么使得从nib文件加载视图是调用UIViewController'sview方法,视图实际上只是从nib加载时第一次调用view方法.
从这个意义上讲,一条简单的[viewController view]消息会强制视图从nib文件加载.
Jus*_*cle 14
好吧,我有一个部分答案 - 也许大师可以解释一些.问题是:
[self.navigationController pushViewController:myViewController animated:YES];
Run Code Online (Sandbox Code Playgroud)
仔细观察,在这种情况下self.navigationController是零 - 所以推送消息不会在哪里.
相反,如果我发送:
[self.view addSubview:self.myViewController.view];
Run Code Online (Sandbox Code Playgroud)
然后出现并-viewDidLoad调用视图.
我不完全确定为什么self.navigationController不在这个实例中设置 - 我唯一能想到的是它self是一个子类UIViewController而不是UITableViewController(pushViewController代码来自哪里).
此外,默默地允许消息转为零似乎是一个坏主意,虽然这些答案 说不然.另见我的问题在这里.
最终编辑:
在下面的评论中的答案,我已经意识到我实际上的显示功能(给定myViewController是模态)是:
[self presentModalViewController:myViewController animated:YES];
Run Code Online (Sandbox Code Playgroud)
感谢大家的有益回应.
小智 8
找到解决方案!!!!!
即便是像这样无害的东西 viewDidLoad方法调用发生.
在alloc之后插入此权限 initWithNibName
viewController.view.hidden = NO; //calls viewDidLoad
Run Code Online (Sandbox Code Playgroud)
简单地使用
- (void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
//Your Code here
}
Run Code Online (Sandbox Code Playgroud)
而不是viewDidLoad方法.
您可能没有将假定ViewController的内容main.storyboard与您创建Identity Inspector的自定义链接起来class.你也许可以导航到通过塞格斯从其他视图控制器,控制器,但是任何的viewDidLoad(),viewWillAppear()等会不会被执行.
| 归档时间: |
|
| 查看次数: |
59021 次 |
| 最近记录: |