iPhone View не обновляется с помощью UITabBarController при программном изменении вкладок

Настройте новый проект на основе окна iPhone с UITabBarController и подключите все в IB. Используя self.tabBarController.selectedIndex = 1; вы должны иметь возможность программно переключать вкладки. Но, кажется, это работает только в определенных обстоятельствах. Если вы привяжете его к IBAction или в результате выбора изображения, он отлично работает. Но если вы вызываете его слишком быстро, кажется, что он работает только частично. Вкладка выбирается в представлении, которое по-прежнему остается старым представлением.

Пробовал поставить self.tabBarController.selectedIndex = 1; в операторе switch в viewDidLoad в качестве метода возврата на ранее выбранную вкладку при запуске, и это не сработает. Затем я добавил NSTimer и попытался сделать это через 0,01 секунды, и он отлично работает, поэтому, очевидно, это проблема времени/порядка.

Любые предложения о том, когда я должен быть свободен, чтобы переключать вкладки?


person jriskin    schedule 19.08.2009    source источник
comment
Не могли бы вы добавить несколько соответствующих фрагментов кода? Это может помочь диагностировать проблемное место.   -  person Tyler    schedule 19.08.2009
comment
Что ж, это случается постоянно, и с тех пор я кое-чему научился. Я решил 99% своей проблемы с этим. [самостоятельный селектор: @selector(switchView:) withObject:nil afterDelay:0.0]; Что, по крайней мере, немного менее грязно, чем таймер. Это, по-видимому, не позволяет ему работать до тех пор, пока не завершится текущий цикл выполнения. Из того, что я могу сказать, если вы попытаетесь изменить представления в том же цикле запуска вкладки, которая появляется, это просто не устраивает. Просто создайте любое пустое приложение для iPhone с UITabBarController и укажите self.tabBarController.selectedIndex = 1; в viewDidLoad или viewDidAppear в качестве примера.   -  person jriskin    schedule 21.08.2009


Ответы (1)


Поскольку вы начали с оконного проекта, я предполагаю, что вы создаете свой контроллер панели вкладок программно. Проблема здесь в том, что viewDidLoad срабатывает, как только ваш контроллер панели вкладок инициализируется (alloc/init). Поскольку свойство контроллера представления вашего контроллера панели вкладок не установлено до тех пор, пока после этого вы устанавливаете выбранный индекс равным 1, когда счетчик контроллера представления равен 0. Согласно документации контроллера панели вкладок, он проглотит ошибку и установит выбранный индекс обратно в 0.

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

Раздражает, что это работает иначе, чем когда контроллер панели вкладок загружается из пера. Если он загружается из пера, контроллеры представления присутствуют до вызова viewDidLoad.

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

  1. Добавьте свои контроллеры представления в контроллер панели вкладок в методе init/initWithNibName панелей вкладок. Затем вы можете установить выбранный вами индекс в viewDidLoad
  2. Переопределите метод setViewControllers и установите выбранный индекс после их добавления.

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

person Dustin    schedule 19.10.2009