【问题标题】:How can one create a generic (container)controller that will recieve as input another controller如何创建一个将接收另一个控制器作为输入的通用(容器)控制器
【发布时间】:2010-12-11 02:22:23
【问题描述】:

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

我在某处有以下方法

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

在 MyContainerController.m 中,我将控制器保留在一个属性中

- (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 中分配和初始化内容控制器,一切正常。似乎我无法通过我从另一个地方分配的控制器。 谁能帮忙。

【问题讨论】:

    标签: iphone controller containers viewdidload


    【解决方案1】:

    因为你是在 actionMethod 中释放 contentController 您必须在 init 方法中保留 contentController

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

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

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

    希望对你有帮助

    【讨论】:

    • 感谢您的回复。首先,你是对的,这类似于工具栏/导航控制器。它的想法完全相同,但它们不适合我的需求。其次,这不正是将 contentController 作为具有保留的属性的目的吗(这样我就不需要自己保留它了)?
    • 如果您知道它们(UINavigationController 或 UITabBarController),但仍然认为它们不是您想要的,那没关系。其次,Yes 就像拥有一个带有保留的属性。如果是这样,您需要在 dealloc 实现中释放它。您也可以将其作为分配,但您必须确保包含的控制器未释放,否则您的应用程序将再次崩溃(EXC_BAD_ACCESS)。在这种情况下最好保留;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2015-09-07
    相关资源
    最近更新 更多