UISegmentedControl в UINavigationBar исчезает, когда UIViewControllers не постоянно восстанавливаются - PullRequest
0 голосов
/ 30 декабря 2011

Я использую UISegmentedControl в панели навигации для переключения между UIViewControllers в моем приложении. Однако UISegmentedControl исчезает с панели навигации после нескольких переключений UIViewControls. Это происходит только тогда, когда элементы управления представлением не инициализируются и не распределяются заново каждый раз при нажатии сегментированного элемента управления. Другими словами, если я назначаю новый UIViewController каждый раз, когда я хочу переключить представления в моем приложении, наблюдается ожидаемое поведение (например, UISegmentedControl не исчезает). Однако это не практичное решение, так как я хочу сохранить состояние скрытого представления, когда пользователь переключает представления.

У меня здесь репозиторий простого проекта, где это наблюдается. Проект состоит из двух коммитов: более старый, где эта проблема наблюдается, и более новый, где проблема «решается» путем постоянного повторного создания экземпляра.


Подробнее о предыдущем коммите в этом репо:

didFinishLaunchingWithOptions в accountingAppDelegate - это то, где два контроллера представления для приложения (RootViewController и CalendarViewController) оба созданы для жизненного цикла приложения.

UISegmentedControl загружается из файла NIB с именем SegmentedControl.xib в методе didFinishLaunchingWithOptions.

Метод toolBarItems в accountingAppDelegate является вспомогательным методом для обоих методов viewDidAppear viewcontroller, где установлено свойство toolbarItems каждого viewcontroller. UINavigationController просматривает это свойство, чтобы назначить элементы на панели инструментов навигации для текущего представления, исходя из моего понимания Apple docs (см. «Отображение панели инструментов»).

Единственное отличие от новой фиксации состоит в том, что новые экземпляры RootViewController и CalendarViewController создаются каждый раз, когда пользователь переключается с одного на другой.


Мой вопрос таков: почему постоянное повторное создание решает проблему? И что более важно, могу ли я предотвратить исчезновение UISegmentedControl и для сохранения состояний просмотра моего приложения?

1 Ответ

0 голосов
/ 30 декабря 2011

Судя по комментарию, я не думаю, что это подходящий способ сделать это. По сути, когда вы меняете rootViewController на UINavigationController, вы как бы сбрасываете его! Итак, вам нужно снова запустить viewControllers!

Я предлагаю вам сделать следующее:

  1. создать экземпляр RootViewController (например, rvc)
  2. создать экземпляр CalendarViewController (например, cvc)
  3. добавить их в NSArray или NSMutableArray
  4. создать экземпляр UINavigationController и initWithRootViewController: экземпляр UIViewController (не rvc или cvc).
  5. начните с того, который вы хотите показать первым: например,

    pushViewController: анимированный rvc: НЕТ

  6. когда вам нужно поменять местами:

    popToRootViewControllerAnimated: НЕТ

    pushViewController: cvc animated: NO

С точки зрения UINavigationController вы запускаете и нажимаете viewControllers с точки зрения пользователя - поскольку он не анимирован, вы меняете его местами!

Хотя, если вы хотите иметь анимацию. Вы не можете сделать это таким образом. Вместо UINavigationController, во-первых, вы должны использовать UIViewController, добавить UIToolBar с UISegment и добавить представление cvc и rvc к UIViewController, и при необходимости поменять их местами с анимация.

и некоторые другие предложения: Этот метод [NSArray arrayWithObject:[[CalendarViewController alloc]init]]; не подходит. Когда вы передаете объект в NSArray, NSArray владеет им, поэтому он будет держать его. Лучше не инициализировать / распределять его, или, если вам нужно, после передачи его в NSArray, отпустите его.

...