loadview被称为无限次

时间:2013-07-01 12:45:10

标签: ios uiviewcontroller

我的应用ViewController1.mViewController2.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而我没有使用任何导航控制器。

有人可以指出这个问题背后的原因吗?

3 个答案:

答案 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,而是创建一个从configureViewawakeFromNib调用的简单initWithNib...方法,以便可以从故事板或nib中正确创建视图或实例化按代码。