Приложение для iPhone с панелью вкладок и панелью навигации в качестве пиров - PullRequest
1 голос
/ 15 апреля 2010

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

По сути, у меня есть несколько «страниц» («home», «settings» и т. Д.), Каждая из которых имеет свою вкладку. Я также хотел бы, чтобы "домашняя" страница была корневым представлением панели навигации, а другие страницы - представлениями второго уровня панели навигации. То есть я должен иметь возможность переходить на любую страницу, щелкая соответствующий элемент панели вкладок, и иметь возможность переходить на домашнюю страницу с любой другой страницы, нажимая кнопку назад на панели навигации.

В настоящее время у меня есть UINavigationBar (через UINavigationController) и UITabBar (через UITabController) как дочерние элементы UIView. Контроллеры представления различных страниц задаются в качестве свойства viewControllers контроллера вкладок, а контроллер домашней страницы также устанавливается в качестве корневого представления контроллера навигации. Каждый тег просмотра страницы имеет свой индекс в элементе управления вкладкой. У меня есть следующая логика в методе делегата didSelectViewController контроллера вкладок:

- (void) tabBarController:(UITabBarController*) tabBarController
    didSelectViewController:(UIViewController*) viewController
{
    if ([navController.viewControllers count] > 1)
        [navController popViewControllerAnimated:NO];

    [navController pushViewController:viewController animated:YES];
}

Кроме того, в методе делегата didShowViewController контроллера навигации у меня есть следующий код:

- (void) navigationController:(UINavigationController *) navigationController
    didShowViewController:(UIViewController *)viewController
    animated:(BOOL)animated
{
    tabController.selectedIndex = viewController.view.tag;
}

Проблема, которая возникает, заключается в том, что когда я запускаю это, панель навигации, панель вкладок и домашняя страница отображаются нормально, но панель вкладок не реагирует на ввод - я не могу выбрать другую вкладку.

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

У кого-нибудь есть предложения относительно того, что не так и как это исправить? Я, наверное, упускаю что-то очевидное, но что бы то ни было, я не могу найти это. Спасибо!

РЕДАКТИРОВАТЬ: Я предполагаю, что это как-то связано с тем, что оба контроллера пытаются владеть контроллером страницы, но я не могу найти решение этой проблемы.

1 Ответ

1 голос
/ 15 апреля 2010

Хлоп. Ты выход из положения здесь. Я усвоил сложный способ, которым UINavigationController и UITabBarController не очень удобны, когда вы пытаетесь использовать их нестандартными способами. UINavigationBar и UITabBar не были предназначены для сосуществования в иерархии представления. Они действительно хотят быть дальними родственниками. Может быть, подход, который вы преследуете, может как-то сработать, но лично я бы даже не попробовал.

С учетом сказанного я предложу одну вещь, которую вы можете проверить, а затем я расскажу вам, как я подхожу к проблеме.

Реализовали ли вы, и возвращаете ли вы ДА из tabBarController: shouldSelectViewController: в вашем UITabBarControllerDelegate? Если нет, это помешает переключению ваших вкладок.

Предполагая, что это не решит всех ваших проблем, вот что я сделал бы, чтобы получить поведение, которое вы ищете:

  1. Создайте UITabBarController и установите его представление в качестве корневого представления вашего окна.

  2. Создайте отдельный UINavigationController под каждой вкладкой, каждая со своей собственной панелью навигации. (Это стандартный способ совместного использования UINavigationController и UITabBarController.)

  3. Установите UITableViewController, который отображает идентичную копию таблицы главного меню в качестве корневого контроллера представления для каждого контроллера навигации.

  4. Когда на контроллере представления «Домой» выбрана строка, переключитесь на соответствующую вкладку содержимого.

  5. Установите делегата на вашем UITabBarController. В его tabBarController: didSelectViewController метод, вызовите pushViewController: animated :. Это похоже на то, что вы делаете в настоящее время, за исключением того, что вы будете вызывать его на (UINavigationController *) tabBarController.selectedViewController.

  6. В viewDidAppear: animated: корневых контроллеров представления ваших вкладок контента переключитесь на вкладку «Главная». Таким образом, когда пользователь нажимает кнопку «Назад», чтобы вернуться в «Домой», он переключается на правую вкладку. (Вам также может понадобиться условный код, чтобы предотвратить это, когда пользователь впервые выбирает вкладку содержимого. Я не уверен.)

Мне будет любопытно узнать, принимает ли Apple такое нестандартное поведение. Вернись и дай нам знать. Кроме того, дайте нам знать, если ваш подход работает как-то.

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