Проблемы с UIMoreNavigationController и UITabBarController - PullRequest
2 голосов
/ 24 февраля 2012

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

Вот фон приложения.Существует около 6 различных вкладок, которые пользователь может использовать, отображаемых с помощью UITabBarController.Каждая из этих вкладок является пользовательским подклассом UIViewController внутри UINavigationController.Все 6 вкладок настроены внутри nib-файла (MainWindows.xib).

Мне нужно иметь возможность скрывать и отображать разные вкладки в зависимости от того, вошел пользователь в систему или нет, и от того, кто вошел в нее.в.У меня это работает так:

При запуске приложения (application: didFinishLaunching: ...) шесть вкладок сохраняются в NSMutableArray, который у меня есть.Это прекрасно работает ...

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

[tabBar setViewControllers: [NSArray arrayWithObjects:
                                      [viewControllers objectAtIndex:1],
                                      [viewControllers objectAtIndex:5],
                                      nil] animated:YES];

viewControllers - это NSMutableArray, который я сделал ранее с 6 вкладками.Выполнение NSLog на нем сразу после его создания дает следующее:

2012-02-24 11:45:57.690 [redacted][26155:207] (
    "<UINavigationController: 0x8249db0>",
    "<UINavigationController: 0x841a3f0>",
    "<UINavigationController: 0x824be40>",
    "<UINavigationController: 0x824dbd0>",
    "<UINavigationController: 0x824e810>",
    "<UINavigationController: 0x841dfb0>"
)

Однако, когда я печатаю значение self.parentViewController из последнего пользовательского контроллера представления, который находится внутри последнегоконтроллер навигации в этом списке, я получаю это:

2012-02-24 11:54:51.247 [REDACTED][26306:207]  <UIMoreNavigationController: 0x826ab00>
2012-02-24 11:54:51.248 [REDACTED][26306:207]  <UITabBarController: 0x8257c50>

Первая строка - это self.parentViewController, вторая - self.parentViewController.parentViewController

Похоже, что иерархия:

UITabBarController -> UIMoreNavigationController -> MyCustomController

Однако, когда я печатаю [self.parentViewController.parentViewController viewControllers]

Я все еще получаю:

(
    "<UINavigationController: 0x8259770>",
    "<UINavigationController: 0x825aa60>",
    "<UINavigationController: 0x825bec0>",
    "<UINavigationController: 0x82612c0>",
    "<UINavigationController: 0x8261ec0>",
    "<UINavigationController: 0x8263b00>"
)
* 1030UIMoreNavigationController ушел?Кто-нибудь может объяснить, что происходит?Я сталкиваюсь с проблемами, связанными с этим, потому что я использую этот массив, однако последний UINavigationController не является объектом, на который он претендует.

У меня есть предчувствие, что яблоко возится с объектами за кулисами, чтобысделать это проще для программиста ...

Я постараюсь ответить на любые ваши вопросы о том, как структурирован код, как я использую различные объекты или тестировать некоторый код.Заранее большое спасибо.

Ответы [ 3 ]

4 голосов
/ 05 марта 2012

На самом деле moreViewController панели вкладок - это UIMoreNavigationController. (Вы можете взглянуть на приватный заголовок на GitHub )

Как указано в документации, свойство viewController содержит только те viewControllers, которые вы добавили на панель вкладок: You must also not look for the More navigation controller in the array of view controllers stored in the viewControllers property. The tab bar controller does not include the More navigation controller in that array of objects.

См. Документацию здесь: UITabbarViewController .

Во всяком случае, я не понимаю, в чем ваша проблема. Если вам нужно получить доступ к UIMoreNavigationController, сделайте это через свойство moreNavigationController UITabBarViewController.

Но свойство 'viewControllers' всегда содержит только те ViewControllers, которые вы добавили в TabBar.

1 голос
/ 13 мая 2012

Просто для подтверждения есть такая же проблема.Я считаю, что использование setViewController: не работает в ситуациях, когда UITabBarController создал UIMoreNavigationController.Проблема заключается в том, что при смене контроллеров представления панели вкладок, чем больше контроллер навигации поддерживается неправильно - иерархия контроллеров нарушается.Я подал ошибку в Apple, но еще не получил ответ.

  • Харальд
1 голос
/ 28 февраля 2012

Поскольку вы не говорите, какова ваша настоящая проблема, я ничего не могу сказать об этом. Но я совершенно уверен, что такого класса, как UIMoreNavigationController, не существует. Навигационный контроллер «Больше» - это просто UINavigationController, управляемый UITabBarController для хранения любых избыточных дочерних контроллеров. См. Справочник Apple UITabBarController , но вы также можете дважды проверить его в заголовочном файле фреймворка UIKit UITabBarController.h.

Соответственно, я не смог воспроизвести ваш отладочный вывод, где вы показываете <UIMoreNavigationController: 0x826ab00>. В моей среде (SDK 5.0) я просто получаю <UINavigationController: 0x12345678>, независимо от того, проверяю ли я родительский элемент моего пользовательского контроллера представления или дочерние элементы контроллера панели вкладок.

...