2

我快要疯了:

GolOlurActionViewController *golOlur = [[GolOlurActionViewController alloc] init];
[self.view addSubview:golOlur.view];

我有上面的代码,我在IBACtion里面调用它ViewControllerGolOlurActionViewControllerViewController你们都可以猜到的。

当进程开始时,调用 golOlurviewDidLoadviewDidAppear方法,但不显示视图。

我已经尝试了我所知道的一切,但无法解决这个问题。

4

2 回答 2

10

addSubview如果您的意图是在视图之间转换,您真的不应该使用。如果这样做,您将不会收到旋转事件,因为您允许视图控制器层次结构与视图层次结构不同步。您应该addSubview仅用于向视图添加真正的子视图(例如 a UILabel、 a UIImageView、 aUIButton等,或者,如果执行正确的视图控制器包含等,则为子视图)。视图之间转换的使用addSubview代表了视图控制器和视图之间的基本混淆。

正确管理视图的关键是确保视图控制器层次结构与视图层次结构同步。最简单的方法是在视图控制器之间进行转换,让它们处理视图的呈现。因此,如果您使用的是 NIB,通常是:

GolOlurActionViewController *golOlur = [[GolOlurActionViewController alloc] initWithNibName:nil bundle:nil];
[self presentViewController:golOlur animated:YES completion:nil];

或者,带有导航控制器的 NIB:

GolOlurActionViewController *golOlur = [[GolOlurActionViewController alloc] initWithNibName:nil bundle:nil];
[self.navigationController pushViewController:golOlur animated:YES];

或者,如果您使用的是故事板(同样,如果您使用的是故事板,您可能会使用 segues 并且不需要任何这些,但只是为了完整起见):

GolOlurActionViewController *golOlur = [self.storyboard instantiateViewControllerWithIdentifier:@"GolOlurActionView"];
[self presentViewController:golOlur animated:YES completion:nil];

如果您的故事板使用导航控制器:

GolOlurActionViewController *golOlur = [self.storyboard instantiateViewControllerWithIdentifier:@"GolOlurActionView"];
[self.navigationController pushViewController:pushViewController:golOlur animated:YES];

万一您尝试进行控制器遏制,请告诉我们,因为这略有不同(需要调用addChildViewControllerand didMoveToParentViewController),但是如果您正在视图之间进行基本转换,则控制器的正确初始化和随后的调用presentViewController或者pushViewController应该为你做。

更新:

顺便说一句,如果您使用的是故事板(我不认为您是,但以防万一),而不是instantiateViewControllerWithIdentifier,我实际上可能建议您在故事板上定义一个 segue,在 Interface Builder 中为其提供一个标识符字符串,然后使用以下代码过渡到下一个场景:

[self performSegueWithIdentifier:@"yourIdentifier" sender:self];

如果你这样做,它会为你实例化你的控制器,你的整个应用程序的流程将在故事板中准确地表示。

于 2012-07-29T16:29:01.170 回答
2

我相信您的问题是,当您按照自己的方式创建 UIViewController 时,您期望情节提要或 .xib 中的视图出现,这将不起作用。您需要在情节提要中连接一个 push segue(这将需要一个UINavigationController),或者以模态方式呈现新控制器,您也可以在情节提要中执行此操作。如果你有这个 ViewController 的 nib,你可以这样做:

 CustomViewController *controller = [[CustomViewController alloc] initWithNibName:@"CustomViewController.xib" bundle:[NSBundle mainBundle]];

 [self presentViewController:controller animated:YES completion:NULL];    
于 2012-07-29T16:29:45.073 回答