2013-10-24 59 views
0

我想定義一個自定義的演示者來定製我的UI一點,在iPad上實現分割視圖等等。我定義這個類:MVVMCross:CreatePresenter()永遠不會在MvvmCrossTouch設置中調用

class ProjectPresenter : MvxTouchViewPresenter 
{ 
    public ProjectPresenter(UIApplicationDelegate applicationDelegate, UIWindow window) : base(applicationDelegate, window) 
    { 
    } 

    public override void Show(MvxViewModelRequest request) 
    { 
     IMvxTouchView viewController = this.CreateViewControllerFor(request); 
     this.Show(viewController); 
    } 
} 

而且我註冊在我的MvxTouchSetup類,像這樣:

protected override IMvxTouchViewPresenter CreatePresenter() 
{ 
    MvxTrace.Trace("Creating the presenter!"); 
    return new ProjectPresenter(this.ApplicationDelegate, this.Window); 
} 

然而,在Show()方法的斷點永遠不會命中。我試着給Show(),ChangePresentation()等所有重載添加斷點,但它們從來沒有被打中。現在,我知道Xamarin.iOS在涉及斷點的情況下相當不可靠,但即使採用跟蹤方法也不會帶來任何好處。我甚至用引發異常的方法替換了CreatePresenter()方法,該應用程序沒有崩潰。

當我部署它們時,我的應用程序會出現其他修改,所以這不是某種緩存問題,儘管我已經清理了我的PC和Mac上的源代碼。此外,我的設置類的構造函數中的斷點正在被擊中,所以這可能甚至不是Xamarin相關的問題。

我猜我要麼依靠較舊的文檔,要麼我做的事情非常非常愚蠢(我猜測後者)。

回答

2

我認爲CreatePresenter就不叫的唯一原因是,如果你使用的是舊「基於演講者的構造函數爲您Setup


MvxTouchSetup提供了兩種不同的構造函數:

protected MvxTouchSetup(MvxApplicationDelegate applicationDelegate, UIWindow window) 
    { 
     _window = window; 
     _applicationDelegate = applicationDelegate; 
    } 

    protected MvxTouchSetup(MvxApplicationDelegate applicationDelegate, IMvxTouchViewPresenter presenter) 
    { 
     _presenter = presenter; 
     _applicationDelegate = applicationDelegate; 
    } 
https://github.com/MvvmCross/MvvmCross/blob/v3/Cirrious/Cirrious.MvvmCross.Touch/Platform/MvxTouchSetup.cs#L39

默認情況下,基於的NuGet項目,在大多數的MV

vmCross樣本,其中第一個被使用。

但是,第二種形式實際上首先存在,所以它仍然是由於歷史原因 - 防止破舊的應用程序。如果你使用它,那麼CreatePresenter()不會被使用 - 這是不需要的,因爲你在施工期間提供了一個演示者。

+0

現在當我閱讀我的AppDelegate的內容時,這一切似乎非常明顯。謝謝Stuart! –

+0

向舊的構造函數添加一個'''[Obsolete]'''標記可能是一個好主意? –

相關問題