Правильный шаблон дизайна для просмотра вкладок? - PullRequest
2 голосов
/ 06 июля 2011

Я застрял, пытаясь разобраться в этом уже пару дней, и я признаю, что мне нужна помощь.

Корневым контроллером представления моего приложения является контроллер панели вкладок. Я хочу, чтобы на каждой панели вкладок был свой контроллер навигации. Эти навигационные контроллеры имеют совершенно другое поведение.

Так как мне настроить это с точки зрения классов? Согласно документации Apple, я не должен подкласс UINavigationViewController. Итак, куда мне поместить код, который управляет каждым из этих контроллеров навигации? Все ли бросают в App Delegate? Это создаст невозможный беспорядок.

Это приложение должно работать на iOS 4.0 или более поздней версии. (Реально мне, вероятно, потребуется iOS 4.2.)

1 Ответ

2 голосов
/ 06 июля 2011

Это взято из одного из моих приложений.Как вы говорите, вы не должны создавать подкласс UINavigationController, вместо этого вы используете их как есть и добавляете viewcontroller в UINavigationController's.Затем, после установки корневого view-контроллера в каждом UINavigationController, вы добавляете UINavigationController к UITabBarController (фу!).

Таким образом, каждая вкладка будет "указывать" на UINavigationController, который имеет обычный viewcontroller в качестве корневого viewcontroller, и именно корневой viewcontroller (тот, который вы добавляете) будет отображаться при нажатии вкладки с помощью(необязательно) панель навигации вверху.

    UITabBarController *tvc = [[UITabBarController alloc] init];
    self.tabBarController = tvc;
    [tvc release];

    // Instantiates three view-controllers which will be attached to the tabbar.
    // Each view-controller is attached as rootviewcontroller in a navigationcontroller.

    MainScreenViewController *vc1 = [[MainScreenViewController alloc] init];
    PracticalMainViewController *vc2 = [[PracticalMainViewController alloc] init];
    ExerciseViewController *vc3 = [[ExerciseViewController alloc] init];

    UINavigationController *nvc1 = [[UINavigationController alloc] initWithRootViewController:vc1];
    UINavigationController *nvc2 = [[UINavigationController alloc] initWithRootViewController:vc2];
    UINavigationController *nvc3 = [[UINavigationController alloc] initWithRootViewController:vc3];

    [vc1 release];
    [vc2 release];
    [vc3 release];

    nvc1.navigationBar.barStyle = UIBarStyleBlack;
    nvc2.navigationBar.barStyle = UIBarStyleBlack;
    nvc3.navigationBar.barStyle = UIBarStyleBlack;

    NSArray *controllers = [[NSArray alloc] initWithObjects:nvc1, nvc2, nvc3, nil];

    [nvc1 release];
    [nvc2 release];
    [nvc3 release];

    self.tabBarController.viewControllers = controllers;

    [controllers release];

Так я перехожу от одного контроллера к другому (это делается путем нажатия на ячейку в табличном представлении, но, как вы видите, метод pushViewController можно использовать везде, где выwant).

(это взято из другой части приложения)

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (self.detailedAnswerViewController == nil) {
        TestAnsweredViewController *vc = [[TestAnsweredViewController alloc] init];
        self.detailedAnswerViewController = vc;
        [vc release];
    }

    [self.navigationController pushViewController:self.detailedAnswerViewController animated:YES];
}

Свойство self.navigationcontroller, конечно, устанавливается на каждый viewcontroller, который выдвигается в иерархии UINavigationController.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...