2016-04-20 14 views
-1

Ich habe diesen Beitrag von Stuart Logde gelesen, wie man das ViewModel killt, wenn die Ansicht verschwindet.Wird MvvmCross ViewModel in der iOS-Ansicht gelöscht?

http://slodge.blogspot.dk/2013/11/n42-is-my-viewmodel-visible-can-i-kill.html

Ich habe eine komplexe ViewPresenter wo ich manchmal ein Viewcontroller mit einem UINavigationController modal präsentieren und dann die Navigation innerhalb dieser ermöglichen. Sobald ich in einen anderen ViewController navigiert bin und Done gedrückt habe, verlasse ich den gesamten UINavigationController und alle ViewControllers. Der ViewWillDisappear wird in anderen Ansichten als dem obersten nicht aufgerufen, da sie bereits verschwunden sind, daher brauche ich einen anderen Mechanismus.

Wäre es falsch, einen Ansatz wie den folgenden in MvxViewController auf iOS zu folgen?

Dies ist mehr wie der normale Dealloc-Ansatz in iOS, wo man sich oft von der Beobachtung anderer Objekte abmeldet.

+0

Wenn Sie den ViewPresenter zur Präsentation der Ansichten verwenden, verwenden Sie ihn auch, um ihn zu entsorgen. – Pilatus

+0

Ich hatte den Eindruck, dass Sie in Xamarin nicht Dispose manuell auf Ihren Ansichten aufrufen, lassen Sie den GarbageCollector dies tun. Wie auch immer die Dispose-Methode in der View aufgerufen wird, meine Frage ist mehr, ob es in Ordnung ist, das ViewModel von der Dispose-Methode aufzurufen und das ViewModel anmeldet, EventMapper etc. abzumelden, damit auch das ViewModel disponiert wird. – dynamokaj

Antwort

0

In Ihrem benutzerdefinierten Moderator, außer Kraft setzt

public override void Show(MvxViewModelRequest request) 

Sie könnten einen vollständigen Navigationscontroller verwerfen, indem einen ShowViewModel auf einem Vorfahren nennen, die bereits in dem Stapel ist. Daher wird diese Show-Methode immer aufgerufen und die vorhandene viewcontroller-Hierarchie wird geöffnet. Sie können auch einen 'Hinweis' in ShowViewModel verwenden, der in request übergeben wird.

Es kennt die vorhandene Viewcontroller-Hierarchie vor und nach dem Popup. So kennt es jeden verworfenen VC. Du musst Dispose für jeden gepufferten VC aufrufen (Xamarin kann es für dich tun ... nach ein paar Minuten. Außer wenn du harte Verweise auf dein ViewModel oder einen anderen Dienst hast. Es ist zu lang und meine Erfahrung zeigt, dass es dein Gedächtnis füllt).

Der Aufruf von Dispose auf dem Viewcontroller reicht aus, um ein automatisches Dispose auf dem ViewModel auszulösen. Wenn Sie nicht warten möchten, können Sie Dispose auch auf dem Viewmodel aufrufen. Wenn Sie den Viewcontroller kennen, ist es einfach, das Viewmodel zu erhalten (Eigenschaft: ViewModel!).

Ich hoffe, es hilft.