0

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

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


Более подробно о ранее фиксации в этом репо:

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

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

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

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


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

+0

Если я правильно понимаю ваш код, это то, что вы делаете: 1. Вы создаете экземпляр UINavigationController в своем приложении appDelegate. 2. Вы создаете экземпляр RootViewController, который я предполагаю как пользовательский класс UIViewController. 3. Вы создаете экземпляр CalendarViewController, - пользовательский класс UIViewController. 4. Вы меняете их как rootViewController UINavigationController (в пуле 1). Правильно ли это? – Canopus

+0

Да. это верно. В частности, я использую метод setViewControllers: UINavigationController для косвенного изменения свойства rootViewController для UINavigationController. См. Метод indexDidChangeForSegmentedControl в accountappdelegate, чтобы узнать, где это происходит. – Coder

ответ

0

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

Мое предложение состоит в том, что вы делаете следующее:

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

    pushViewController: РВК анимированный: НЕТ

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

    popToRootViewControllerAnimated: НЕТ

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

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

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

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

+0

Я придумал этот метод, основанный на [этой статье] (http://redartisan.com/2010/5/26/uisegmented-control-view-switching-revisited), поэтому я знаю, что другие люди делают это. Статья также ** специально предупреждает об управляющем контроллере представлений, охватывающем массив подматричных контроллеров ** с точки зрения ремонтопригодности и повторного использования кода. Меня больше интересует, почему мой метод не работает. Что вы имеете в виду, я «перезагружаю» UINavigationController? Не возражаете ли вы расширить это? – Coder

+0

Хорошо, основываясь на ссылке, которую вы мне дали, это то, что происходит: когда вы говорите [self.navigationController setViewControllers: theViewControllers animated: NO]; вы заменяете массив viewControllers в UINavigationControllers набором новых viewControllers. Здесь этот массив содержит только один viewController. Делая это, вы размещаете все, включая titleView, который содержит UISegmentControl. В следующей строке указывается: incomingViewController.navigationItem.titleView = aSegmentedControl; , который возвращает или лучше сказать, добавьте контроллер сегмента обратно в titleView. – Canopus

+0

Если вы посмотрите внимательно на репо, вы увидите, что я не использую accessViewController.navigationItem.titleView для установки моего UISegmentedControl. Это потому, что мне нужна панель навигации для отображения других вещей. Поэтому я использую свойство toolbarItems каждого отображаемого контроллера. Это означает, что я не могу использовать код, о котором вы говорите. Мне нужно выяснить, почему мой код не работает, а не использовать incomingViewController.navigationItem.titleView = aSegmentedControl. – Coder

Смежные вопросы