2012-11-25 2 views
0

Я просматриваю между экранами моего приложения iOS.Почему мой ViewController удален из NavigationController.ViewControllers collection

BaseView.NavigationController.ViewControllers

Как переключить экраны, я хранить ссылку на предыдущий экран в статической переменной.

В какой-то момент один из моих элементов удаляется из BaseView.NavigationController.ViewControllers, хотя он все еще действительный viewcontroller, а IsLoaded по-прежнему установлен в значение True/YES.

Когда я использую (простите мой C#/MonoTouch)

BaseView.NavigationController.PopToViewController(CurrentViewController,false); 

, чтобы показать его снова, я получаю NSInternalInconsistencyException Причина: Пробовал совать к контроллеру представления, который не существует. Это понятно, потому что его больше нет в коллекции ViewController.

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

 if (CurrentViewController.IsViewLoaded) 
     { 

      BaseView.NavigationController.PopToViewController(CurrentViewController,false); 
     } 
     else 
     { 
      BaseView.NavigationController.PushViewController(CurrentViewController,true); 
     } 

Мой вопрос, где он делся и почему бы это были удалены из коллекции ViewControllers и когда это StillLoaded = правда/ДА?

+0

Как вы переключаете экраны? – Luke

+0

См. Мои последние изменения. Описано .. – user1060500

+0

Если вам нужна дополнительная информация, то дайте мне знать ... – user1060500

ответ

0

Если я правильно понял, вы используете NavigationController.PopToViewController(controller); для перехода к определенному контроллеру представления, но сохраните ссылку на контроллеры View, которые выталкиваются из стека навигации.

То, что я думаю, происходит потому, что вы держите ссылку на эти контроллеры просмотра, они все еще находятся в памяти, и поэтому свойство IsViewLoaded по-прежнему true, несмотря на то, что контроллер просмотра фактически не существует в стеке навигации.

Не используйте свойство IsViewLoaded, вы должны проверить, существует ли контроллер View в массиве NavigationController.ViewControllers, если он делает это, а затем нажимать на него, если он не нажимает его.

E.g.

if (BaseView.NavigationController.ViewControllers.Contains(CurrentViewController)) 
{ 
    BaseView.NavigationController.PopToViewController(CurrentViewController,false); 
} 
else 
{ 
    BaseView.NavigationController.PushViewController(CurrentViewController,true); 
} 

Редактировать

Так вы упоминаете вы хотели бы вид сохраняться на навигационной стеке. Ну, используя PopToViewController удалит ВСЕ Просмотр контроллеров между TopViewController и указанным контроллером.

Чтобы получить то, что вам нужно, вы можете напрямую манипулировать массивом NavigationControllers.ViewControllers. Только проблема заключается в том, что вы потеряете приятные анимации, которые предоставляют методы Push/Pop.

// Changes order of View Controllers currently in the stack. You can also add/remove 
// controllers using this method. 
NavigationController.ViewControllers = new UIViewController[]{ 
      NavigationController.ViewControllers[1], 
      NavigationController.ViewControllers[0], 
      NavigationController.ViewControllers[3], 
      NavigationController.ViewControllers[2]}; 
+0

Интересно. Дай мне попробовать. Как разработчик, есть ли у нас какой-либо контроль над тем, что сохраняется, а что нет? Предположим, я хочу, чтобы на каком-то экране всегда сохранялся, я могу контролировать это - или я должен всегда проверять, были ли они удалены и создавать новые экземпляры, если они были? – user1060500

+0

Если вы сохраняете ссылку на 'UIViewController', то она сохраняется, она просто не может быть в стеке навигации. Поэтому, если вы используете ссылку в вызове 'PushViewController', вы не обязательно создаете новый экземпляр, когда вы нажимаете его на стек навигации. – Luke

+0

Я понимаю это. Я считаю, что разработчики могут контролировать, когда ViewControllers будут удалены из коллекции ViewControllers. Например, я хочу, чтобы определенный ViewController всегда был в этой коллекции и не удалялся автоматически по какой-либо причине. – user1060500

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