0

Ich habe einen UISplitViewController, mit einem Master-Viewcontroller, der eine Tabelle und eine Detailansicht Controller ist.Change Detail View Controller auf Master View Controller-Element klicken Sie auf UISplitViewController

Ich habe es als so umgesetzt: -

MainViewController.cs

public override void ViewDidLoad() 
    { 
     UpdateView(masterVC,detailVC); 
    } 
    public void UpdateView(UIViewController master, UIViewController detail) 
    { 
     this.ViewControllers = new ViewControllers[]{master, detail}; 
    } 

Dies funktioniert gut. Jetzt möchte ich den Detailansicht-Controller zu einem anderen ändern, wenn der Benutzer auf eine Zeile im Master-Viewcontroller klickt.

Was ich tue, ist: -

public override void RowSelected(UITableView tableView, NSIndexPath indexPath) 
    { 
      var mainVC = StoryBoard.InstantiateViewController("Main_VC") as MainViewController; 
      mainVC.UpdateView(mainVC.ViewControllers[0], newDetailVc); 
    } 

Dies hat nichts tun und die Detailansicht nicht auf den neuen ändern. Wie kann ich das umsetzen?

Antwort

0

Ihr Master-View-Controller wird erneut instanziiert, anstatt einen Zeiger auf das Original zu liefern, das Sie beim Starten der App geladen haben. So weit wie die Anwendung betrifft, aktualisieren Sie einfach die Detailansicht eines Master-View-Controllers das ist nur in der Erinnerung gesessen.

Wenn Sie Ihre Anwendung in der Mainviewcontroller ViewDidAppear Methode erstellen eine statische Referenz auf sich selbst starten, wie so:

public static MainViewController MVCPointer {get; private set;} 

public override void ViewDidAppear(bool animated) 
{ 
    base.ViewDidAppear(animated); 

    MVCPointer = (self as MainViewController). 
} 

Dann rowselected in Ihnen folgendes tun würde:

public override void RowSelected(UITableView tableView, NSIndexPath indexPath) 
{ 
     var mainVC = StoryBoard.InstantiateViewController("Main_VC") as MainViewController; 
     mainVC.MVCPointer.UpdateView(mainVC.MVCPointer, newDetailVc); 
} 

Es gibt viel aufgeräumter Um dies zu erreichen, ist das oben nur eine schnelle Möglichkeit, Ihren aktuellen Code anzupassen. Ich speichere persönlich einen Verweis auf Navigationssteuerungen innerhalb einer statischen Variable in AppDelegate, damit ich überall darauf zugreifen kann, aber das ist vor allem nützlich für Sie Habe eine Anwendung mit vielen verschiedenen Viewcontrollern und Navigationscontrollern.

Die andere Art und Weise zu tun, was Sie wollen, ist eine Referenz Ihres Mainviewcontroller auf Ihre tableviewsource Klasse übergeben Sie können einfach tun, die Art und Weise

(wenn Ihr ein verwenden):

private static MainViewController MVCMain {get ; private set} 

public void nameofyourtableviewsource (object tableviewdata, MainViewController cont) 
{ 
     MVCMain = cont; 
} 

public override void RowSelected(UITableView tableView, NSIndexPath indexPath) 
{ 
     (mainVC.ViewControllers[0] as MainViewController).UpdateView(mainVC, newDetailVc); 
} 
+0

Vielen Dank für die Antworten. Was ist in Ihrer ersten Lösung MVCPointer? – user3034944

+0

Sorry completley beschönigt über das Zuweisen einer Klasse, ich habe gerade das obige Code-Snippet repariert, sollte nun sinnvoll sein. – Digitalsa1nt

+0

Ich habe den ersten Ansatz versucht, aber es funktioniert immer noch genauso wie mein Code. Der Detail-Controller ändert sich nicht – user3034944

Verwandte Themen