Как можно создать универсальный (контейнерный) контроллер, который будет получать в качестве входных данных другой контроллер - PullRequest
0 голосов
/ 11 декабря 2010

В создаваемом приложении есть много страниц, которые выглядят в основном одинаково с другой частью.Чтобы справиться с такой ситуацией, я создал контроллер контейнера, который содержит подпредставление.Я хочу, чтобы это подпредставление было заполнено содержимым другого контроллера (и связанного с ним кончика), который я буду создавать динамически по мере необходимости в зависимости от контекста.

У меня есть где-то следующий метод

- (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, все работает.Кажется, я не могу передать контроллер, который я выделил из другого места.Может ли кто-нибудь помочь.

1 Ответ

0 голосов
/ 11 декабря 2010

Поскольку вы выпускаете contentController в actionMethod вы должны сохранить contentController в вашем методе инициализации

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

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

Но зачем тебе это? Контроллеры должны управлять представлениями, а не другими контроллерами. Если вы думаете, что вам действительно это нужно, тогда вы можете использовать UINavigationController или UITabBarController. Вы также можете загрузить виды без контроллера ( см. Здесь )

Лично я считаю, что использование UIViewController внутри простого UIViewController не является предпочтительным подходом

Надеюсь, это поможет

...