2

У меня есть приложение, где я нахожусь в регистрационной форме, и когда пользователь нажимает кнопку отправки, он берет их на предыдущую страницу. Если на предыдущей странице, если пользователь нажимает, он возвращает их на страницу регистрации, которую я не хочу. Как удалить этот регистрационный вид из стека?Pop current view from stack и push new one Xamarin

Это мой текущий подход:

//inside MyRegistrationController button press 
MyPreviousController SVC = this.Storyboard.InstantiateViewController("MyPreviousController") as MyPreviousController; 
      if(SVC != null){ 
       SVC.offender = offender; 


       //var viewControllers = this.NavigationController.ViewControllers; 
       //viewControllers[viewControllers.Length - 1].View.RemoveFromSuperview(); 
       //this.NavigationController.ViewControllers = viewControllers; 

       this.NavigationController.PopViewController(true); 
       this.NavigationController.PushViewController(SVC, true); 
      } 

Этот нынешний подход делает что-то странное со стеком, который я нажимаю кнопку на MyRegistrationController я иду к MyPreviousController (ип обновляется), а затем быстро перейти к обновленной версии от MyPreviousController вернуться к обновленной версии MyPreviousController, а затем, если я нажму кнопку «Назад», я вернусь к MyPreviousController

+0

Использование 'NavigationController.ViewControllers' будет работать. Проблема с вашим прокомментированным кодом заключается в том, что вы просто удаляете View из ViewController. Вы можете удалить ViewController из массива, установить свойство ViewControllers в обновленный массив, а затем он больше не будет в стеке. – dylansturg

+0

Моя проблема в том, что нет 'UIViewController []' функции удаления, поэтому я не уверен, как идти об удалении элементов из этого массива –

+0

Массивы не позволяют добавлять или удалять элементы - они представляют собой структуру данных фиксированного размера , Это довольно легко сделать с LINQ - добавьте 'using System.Linq;' вверху, затем вы можете сделать 'viewControllers.Take (viewControllers.Length 1) .ToArray();' и он создаст новый массив без последнего ViewController из исходного массива. – dylansturg

ответ

3

Хорошо, я получил работу. Моя проблема оказалась двукратной. Один из них мне понадобился, чтобы вытащить представление, и два мне нужны мои данные таблицы в MyPreviousController для перезагрузки (проблема, которую я не поднимал). Так что мне нужно сделать следующее:

Чтобы просто палить текущий контроллер мне нужно просто сказать:

//inside MyRegistrationController button press 
MyPreviousController SVC = this.Storyboard.InstantiateViewController("MyPreviousController") as MyPreviousController; 
     if(SVC != null){ 
      SVC.offender = offender; 

      this.NavigationController.PopViewController(true); 
} 

Однако делать именно это вызвало мой стол в MyPrevious не обновляется. Поэтому мне нужно, чтобы поставить это в MyPreviousController.cs:

public override void ViewWillAppear (bool animated) 
    { 
     base.ViewWillAppear (animated); 
     InvokeOnMainThread (delegate { 
      TableView.Source = source; 
      TableView.ReloadData(); 
     }); 
    } 

и успешно обновили таблицу и удалить вид регистрации

+0

Предполагая, что 'нарушитель' является свойством на контроллере представления, а не просто поместить код из« ViewWillAppear »в средство настройки свойства? 'ViewWillAppear' происходит каждый раз, когда отображается представление. Поэтому, когда он открывается в первый раз или когда пользователь возвращается к нему. Просто убедитесь, что вы не вызываете 'ReloadData' в представлении таблицы как нечто вроде« ViewDidLoad », иначе он будет обновлять представление таблицы дважды. –