我的应用ViewController1.m
和ViewController2.m
中有两个ViewControllers。
在AppDelegate
我正在使用此代码。
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
{
self.viewController = [[ViewController1 alloc] initWithNibName:@"ViewController_iPhone" bundle:nil];
}
else
{
self.viewController = [[ViewController1 alloc] initWithNibName:@"ViewController_iPad" bundle:nil];
}
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
在ViewController1.m中,我添加了一个按钮,点击按钮我正在显示另一个视图控制器ViewController2.m
,如下所示:
ViewController2 * obj = [[ViewController2 alloc] initWithNibName:nil bundle:nil];
[self.view addSubview:obj.view];
在ViewController2.m的loadView
中,我添加了另一个按钮
NSLog(@"\n Load view called");
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button addTarget:self action:@selector(onButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
[button setTitle:@"Back to previous view" forState:UIControlStateNormal];
button.frame = CGRectMake(80.0, 210.0, 160.0, 40.0);
[self.view addSubview:button];
当我运行我的应用程序时,单击ViewController1.m中的按钮,应用程序挂起,ViewController2.m的loadView
开始无限调用。
我不知道这个问题背后的原因,我只想在点击按钮上加载另一个ViewController而我没有使用任何导航控制器。
有人可以指出这个问题背后的原因吗?
答案 0 :(得分:4)
请勿在{{1}}中执行此操作。而是将代码移至loadView
。问题是您正在viewDidLoad
内访问self.view
,因为对loadView
的初始调用从未返回,所以基本上会调用loadView
。
很抱歉,当视图尚未实例化时,会自动调用loadView
。仅在返回时才进行视图初始化。如果它没有返回并且您尝试访问loadView
属性,它将再次调用它。在你的情况下,它是递归的,因为你仍然在view
方法。
来自docs:
视图控制器在请求view属性但当前为nil时调用此方法。此方法加载或创建视图并将其分配给视图属性。
答案 1 :(得分:0)
使用initWithNibName
时,请勿覆盖loadView
。这是一个错误的设计。如果您不想使用viewDidLoad
并希望在初始化阶段使用某些内容,则覆盖此方法,
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// write your init code here.
}
return self;
}
答案 2 :(得分:0)
loadView
的专有工作是设置viewControllers视图属性。这可能是
self.view = [[UIView alloc]initWithFrame:[UIScreen mainScreen].bounds];
想象一下,您的view属性的getter看起来像这样:
if(!_view)
[self loadView];
return _view;
这意味着如果在设置视图之前使用self.view(如在loadView中),则会反复调用loadView。我的建议通常是避免覆盖loadView,而是创建一个从configureView
和awakeFromNib
调用的简单initWithNib...
方法,以便可以从故事板或nib中正确创建视图或实例化按代码。