1

我的应用中有两个 ViewControllerViewController1.mViewController2.m.

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];

loadViewViewController2.m 中,我添加了另一个像这样的按钮

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 中的按钮时,应用程序挂起,并且loadViewViewController2.m 开始被无限调用。

我不知道这个问题背后的原因,我只是想在单击按钮时加载另一个 ViewController 而我没有使用任何导航控制器。

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

4

3 回答 3

4

不要在loadView. 而是将您的代码移动到viewDidLoad. 问题是您正在访问self.viewwithin loadView,这基本上是loadView自最初调用以来一直调用的,loadView从未返回。

抱歉绕口令...loadView当视图尚未实例化时会自动调用。只有当它返回时,视图初始化才完成。如果它没有返回并且您尝试访问该view属性,它将再次调用它。在您的情况下,它是递归的,因为您仍在该loadView方法中。

文档

视图控制器在其视图属性被请求但当前为 nil 时调用此方法。此方法加载或创建视图并将其分配给视图属性。

于 2013-07-01T12:50:42.483 回答
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 正确创建视图或通过代码实例化。

于 2013-07-01T16:31:27.080 回答
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;
}
于 2013-07-01T13:30:31.390 回答