2016-04-12 22 views
0

Ich habe ein altes Projekt auf Xamarin.iOS Unified und MvvmCross 4.1 aktualisiert.MvvmCross - View nicht geladen

Wenn ich die app laufen lasse, erhalte ich die folgende Ausnahme:

MvvmCross.Platform.Exceptions.MvxException: Ansicht nicht für MyView geladen

Meine Klassen wie folgt aussehen:

MyView : MvxViewController<MyViewModel> {} 

MvxViewController<T> : UIViewController, IMvxBindingContextOwner, IUIWrappable 
    where T : ViewModelBase 

ViewModelBase : MvxViewModel {} 

Ich vermute, dass ich eine Schnittstelle oder etwas auf MyView vermisse, damit MvvmCross korrekt funktioniert, aber ich bin mir nicht sicher, welche Schnittstelle das sein könnte.

Ich vermute dies, weil ich schon hart in Mappings zwischen dem View und seinem ViewModel Code codieren musste, um MvvmCross zu ermöglichen, das ViewModel durch Reflection/Auto-Discovery zu finden, die MyView zugeordnet sind. Das heißt, vor diesem Fehler konnte ich den zugehörigen ViewModel-Fehler nicht finden.

Wenn ich MyView IMvxIosView implementiere, verschwindet dieser Fehler, und ich bekomme dann einen NULL-Verweis auf das ViewModel später in meinem Code, so dass irgendwo nicht instanziiert wird, wo es benötigt wird. Mein Eindruck war, dass dies alles automatisch von MvvmCross gehandhabt werden sollte, aber ich könnte mich irren.

ich bei Proben suchen wie https://github.com/MvvmCross/MvvmCross/wiki/Tip-Calc-A-Xamarin.iOS-UI-project

wo TipView

enthält
public new TipViewModel ViewModel { 
    get { return (TipViewModel) base.ViewModel; } 
    set { base.ViewModel = value; } 
} 

Basis MyView der hat keine solche Eigenschaft Ansichtsmodell. Was fehlt mir, um darauf zugreifen zu können?

Der Beispielcode von TipCalc verweist immer noch auf den Namespace Cirrious, daher ist es möglich, dass sich die Dinge geändert haben.

Alle Vorschläge sind willkommen. Ich bin neu bei Xamarin und MvvmCross (obwohl ich in der Windows/iOS-Entwicklung erfahren bin), und ich habe Probleme, die aktuellste Dokumentation zu finden.

+2

Aus Ihrer Frage ist nicht ganz klar, was Sie fragen. Haben Sie eine vollständigere reproduzierbare Probe? – Cheesebaron

Antwort

0

Versuch dies zu tun:

var vc = this.CreateViewControllerFor(MvxViewModelRequest.GetDefaultRequest(viewModelType);) as MvxViewController; 
    vc.OnViewCreate(); 

Die vc.OnViewCreate(); sollte, wird Ihre View geladen gewährleisten.

Und die Zeile: this.CreateViewControllerFor(MvxViewModelRequest.GetDefaultRequest(viewModelType);) as MvxViewController;

sicherstellen soll, dass die Viewcontroller mit dem Viewmodel gesetzt bereits erstellt wird. Auf diese Weise müssen Sie es nicht manuell festlegen.

Diese Methode ist eine Erweiterung Methode in der MvxCanCreateIosViewExtensionMethods Klasse definiert https://github.com/MvvmCross/MvvmCross/blob/4.0/MvvmCross/iOS/iOS/Views/MvxCanCreateIosViewExtensionMethods.cs

- Bearbeiten -

Eine andere Sache, die ich in Ihrem Beispielcode bemerkt ist diese Zeile:

MyView : MvxViewController<MyView> {} 

Der Typ Parameter übergeben in MvxViewController<T> sollte die zugehörige ViewModel für MyView, nicht MyView selbst sein.So zum Beispiel, haben Sie vielleicht so etwas wie:

MyViewModel : ViewModelBase {} 

und dann:

MyView : MvxViewController<MyViewModel> {} 

- UPDATE -

Sie sollten aus dem vorhandenen MvxViewController mit MvvmCross zur Verfügung gestellt werden vererben. https://github.com/MvvmCross/MvvmCross/blob/3c735adc534a5df2d4730e9d58a08f7863c30cee/MvvmCross/iOS/iOS/Views/MvxViewController.cs

+0

Danke für den Vorschlag. Ich kann die Ansicht ohne Problem instanziieren, aber der CreateViewController wirft eine Nullreferenz in MvvmCross, und ich kann nicht sehen, wo gerade jetzt, da die Bibliothek verpackt ist. Ich muss die Quelle herunterladen, um zu sehen. Das sagte, ich denke, ich mache etwas sehr falsch. Laut den Samples, die ich gesehen habe, sollte das alles funktionieren. – jyoung

+0

Ah okay. Ich habe etwas anderes in dem von Ihnen bereitgestellten Code bemerkt, siehe das Update zu meiner Antwort. – pnavk

+0

Vielen Dank dafür, dass ich MvxViewController tatsächlich mit dem ViewModel erstellt habe. Ich muss es hier falsch kopiert haben. Mein Fehler. Die ursprüngliche Frage wurde korrigiert. – jyoung

0

Die Implementierung von IMvxIosView löste diesen speziellen Fehler.

Es sieht so aus, als ob MvvmCross die Ansicht nur finden kann, wenn sie diese Schnittstelle implementiert.

Jetzt bin ich auf andere Fehler.

+1

Sie sollten IMvxIosView nicht auf einem ViewController implementieren müssen. All Ihre ViewController sollte von der MvxViewController-Klasse von MvvmCross erben: https://github.com/MvvmCross/MvvmCross/blob/3c735adc534a5df2d4730e9d58a08f7863c30cee/MvvmCross/iOS/iOS/Views/MvxViewController.cs – pnavk

+0

@pnavk, mit dem integrierten MvxViewController Klasse in MvvmCross.iOS.Views Namespace wirkte Wunder. Ich bin nicht sicher, warum die ursprünglichen Entwickler diese andere Klasse gemacht haben, aber sie scheint nicht mehr benötigt zu werden. Wenn Sie mit einer Antwort antworten, akzeptiere ich sie. – jyoung

+1

Ich habe das als Update zu meiner Antwort hinzugefügt. Froh, dass du Dinge funktionst hast :) – pnavk