2

Ich habe eine App, wo ich in einem Registrierungsformular bin und wenn der Benutzer auf Senden klickt, bringt es sie auf die vorherige Seite. Wenn der Benutzer auf der vorherigen Seite zurückklickt, werden sie zurück auf die Registrierungsseite gebracht, die ich nicht möchte. Wie kann ich diese Registrierungsansicht vom Stapel entfernen?Pop aktuelle Ansicht von Stapel und Push neue Xamarin

Dies ist mein aktueller Ansatz:

//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); 
      } 

Dieser Strom Ansatz macht etwas seltsam mit dem Stapel, die ich auf die Schaltfläche klicken auf MyRegistrationController ich zur MyPreviousController (un aktualisiert) gehe dann gehen schnell zu einer aktualisierten Version von MyPreviousController zurück zu einer aktualisierten Version von MyPreviousController und dann, wenn ich auf den Zurück-Button gehe ich zurück zu MyPreviousController

+0

Mit dem 'NavigationController.ViewControllers' arbeiten. Das Problem mit Ihrem auskommentierten Code ist, dass Sie nur die Ansicht vom ViewController entfernen. Sie können den ViewController aus dem Array entfernen, die ViewControllers-Eigenschaft auf das aktualisierte Array setzen und dann nicht mehr im Stack. – dylansturg

+0

Mein Problem ist, dass es keine 'UIViewController []' Funktionen zu entfernen gibt, also bin ich mir nicht sicher, wie man Elemente aus diesem Array entfernt –

+0

Arrays erlauben nicht das Hinzufügen oder Entfernen von Elementen - sie haben eine feste Datenstruktur . Es ist ziemlich einfach mit LINQ zu tun - füge oben 'using System.Linq;' hinzu, dann kannst du 'viewControllers.Take (viewControllers.Length 1) .ToArray(); 'machen und es wird ein neues Array ohne das letzte erstellt ViewController aus dem ursprünglichen Array. – dylansturg

Antwort

3

Okay, ich landete es zu arbeiten. Mein Problem endete zweifach. Eine, die ich brauchte, um die Ansicht abzubrechen, und zwei ich benötigte meine Tabellendaten in MyPreviousController, um neu zu laden (ein Problem, das ich nicht brachte). Also brauchte ich folgendes zu tun:

Um einfach die aktuelle Controller-Pop-off musste ich nur sagen:

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

      this.NavigationController.PopViewController(true); 
} 

jedoch nur tun, das ist mein Tisch verursacht in MyPrevious nicht aktualisiert. Also brauchte ich diese setzen in den MyPreviousController.cs:

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

und erfolgreich die Tabelle aktualisiert und entfernt die Registrierung Ansicht

+0

Angenommen, 'täter 'ist eine Eigenschaft auf dem View-Controller, indem Sie nicht nur den Code aus' ViewWillAppear' in den Setter der Eigenschaft? 'ViewWillAppear' findet jedes Mal statt, wenn die Ansicht angezeigt wird. Also wenn es das erste Mal öffnet oder wenn der Benutzer darauf zurückkommt. Stellen Sie nur sicher, dass Sie 'ReloadData' in der Tabellenansicht nicht in einer Art wie der' ViewDidLoad' aufrufen, sonst wird die Tabellenansicht zweimal aktualisiert. –

Verwandte Themen