0

在我正在创建的应用程序中,有许多页面看起来几乎相同,但有些部分不同。为了处理这种情况,我创建了一个包含子视图的容器控制器。我希望这个子视图由另一个控制器(及其关联的 nib)的内容填充,我将根据上下文根据需要动态创建它。

我在某处有以下方法

- (void) someAction {
    UIViewController* contentController = [[MyContentController alloc] init];
    UIViewController* containerController = [[MyContainerController alloc] initWithContentController:contentController];
    [navigationController pushViewController:pageController animated:YES];
    [contentController release];
    [containerController release];
}

在 MyContainerController.mi 中将控制器保留在一个属性中

- (id)initWithContentController:(UIViewController *)aContentController {
    if ((self = [super initWithNibName:@"MyContainerController" bundle:nil])) {
        contentController = aContentController;
    }
    return self;
}

稍后在 viewDidLoad 我执行以下操作

- (void)viewDidLoad {
    [super viewDidLoad];
    [contentViewContainer addSubview:contentController.view];
}

contentViewContainer 是应该保存页面特定信息的视图。不幸的是,EXC_BAD_ACCESS 失败了。有趣的是,如果我从 viewDidLoad 中分配和初始化内容控制器,一切正常。似乎我无法通过我从另一个地方分配的控制器。任何人都可以提供帮助。

4

1 回答 1

0

由于您在 actionMethod 中释放 contentController,因此您必须在 init 方法中保留 contentController

- (id)initWithContentController:(UIViewController *)aContentController {
    if ((self = [super initWithNibName:@"MyContainerController" bundle:nil])) {

        contentController = [aContentController retain];
    }
    return self;
}

但是,你为什么需要这个?控制器应该控制视图而不是其他控制器。如果你认为你真的需要它,那么你可能想要使用 UINavigationController 或 UITabBarController。您也可以在没有控制器的情况下加载视图(请参见此处

我个人认为在简单的 UIViewController 中包含 UIViewControllers 并不是一种可取的方法

希望能帮助到你

于 2010-12-11T02:30:09.587 回答