由於支持XS iOS故事板的集成,所以我希望能夠將這個特性與MVVMCross結合使用。對Xamarin.iOS的MVVMCross支持故事板
基本上它看起來有點像它不應該工作,因爲故事板指示視圖項目中的導航層次結構,而不是像MVVMCross這樣的視圖模型項目。
但是,如果有一種方法可以讓2個人一起工作,那將是非常棒的。
有沒有人知道這可能會實現?
歡呼聲中,特里斯坦
由於支持XS iOS故事板的集成,所以我希望能夠將這個特性與MVVMCross結合使用。對Xamarin.iOS的MVVMCross支持故事板
基本上它看起來有點像它不應該工作,因爲故事板指示視圖項目中的導航層次結構,而不是像MVVMCross這樣的視圖模型項目。
但是,如果有一種方法可以讓2個人一起工作,那將是非常棒的。
有沒有人知道這可能會實現?
歡呼聲中,特里斯坦
有發表文章,用故事板的至少一個樣本 - 相當奇怪的命名eh
- https://github.com/slodge/eh
該樣品由工作:
MvxViewController
作爲VC基類(代替UIViewController
)ViewModel
一個案例 - 通過直接設置它之前調用base.ViewDidLoad()
- 見https://github.com/slodge/eh/blob/master/storyb/RootViewController.cs#L23Request
的情況 - Segue
導航時 - 見https://github.com/slodge/eh/blob/master/storyb/RootViewController.cs#L40這樣的使用方法將Mvx數據綁定添加到主要由故事板驅動的應用程序非常簡單。
另外,如果開發商寧願讓MVX ShowViewModel
導航系統控制屏幕的流動 - 但也會喜歡這些屏幕將故事板內設計的,那麼這是可以通過開發一個正常MvvmCross應用,但使用從故事板加載ViewController的自定義Presenter
。
在MvvmCross的V3.1.1,您可以在ViewsContainer
水平做到這一點:
MvxTouchViewsContainer.cs
MyContainer
方法protected virtual IMvxTouchView CreateViewOfType(Type viewType, MvxViewModelRequest request)
- 看到這個覆蓋https://github.com/MvvmCross/MvvmCross/blob/b8545752f28f4e569efeaa397c3085b0373e4d8b/Cirrious/Cirrious.MvvmCross.Touch/Views/MvxTouchViewsContainer.cs#L40,加載基於Storyboard的ViewControllers:
protected override IMvxTouchView CreateViewOfType(Type viewType, MvxViewModelRequest request)
{
return (IMvxTouchView)UIStoryboard.FromName("MyStoryBoard", null)
.InstantiateViewController(viewType.Name);
}
創建MyContainer
期間Setup
-
protected override IMvxTouchViewsContainer CreateTouchViewsContainer()
{
return new MyContainer();
}
應該就在這時,工作...
在一個大型項目中,在單個故事板中保留所有視圖可能令人望而生畏。
我更喜歡創建每一個視圖故事板;我修改了集裝箱在斯圖爾特的回答來尋找匹配視圖類情節串連圖板,並退回到主故事板,如果沒有找到:
public class StoryBoardContainer : MvxTouchViewsContainer
{
protected override IMvxTouchView CreateViewOfType(Type viewType, MvxViewModelRequest request)
{
UIStoryboard storyboard;
try
{
storyboard = UIStoryboard.FromName(viewType.Name, null);
}
catch (Exception)
{
storyboard = UIStoryboard.FromName("StoryBoard", null);
}
return (IMvxTouchView) storyboard.InstantiateViewController(viewType.Name);
}
}
買者1:實例viewcontrollers這樣,你必須設置故事板ID在編輯器:
買者2:確保你的看法繼承MvxViewController
具有構造public MyView(IntPtr handle) : base(handle)
,因爲這是用來實例從故事板視圖控制器。
也可以製作支持Storyboard和Xib的容器。也許這可以添加到MvvmCross的默認容器中? –
確保您的視圖類繼承自MvxTouchView,並且您已經在上面的註釋2中實現了構造函數。否則沒有線索,對不起。 –
有沒有人嘗試過這種方法,發現他們的AutoLayout約束都沒有受到尊重?我通過設計器應用約束,在設計器中按預期運行,但在運行時它們完全混亂 –
我做了使用mvvmcross和iOS故事板樣本項目(TipCalc):https://github.com/nicruo/TipCalc.Storyboard
您的演示作品。我試圖複製這個樣本,似乎我做了一些錯誤的事情。你能幫忙嗎? https://github.com/slown1/Xamarin.iOS-Storyboard –
故事板的支持,現在是MvvmCross的一部分。如Geir的回答中所述,使用每個Storyboard方法的一個ViewController,設置Storyboard ID,並用[MvxFromStoryboard]
修飾您的MvxViewController部分類。請參閱我的blog上的示例代碼。
在MvxFromStoryboard裝飾器中設置故事板名稱的有用參考:https://www.mvvmcross.com/documentation/platform/ios-user-interfaces-approaches#storyboards –
第二種方法是絕對要做到這一點,只要我們發展真正的跨平臺應用程序正確方法。最好使用ShowViewModel進行導航,並在平臺之間共享此邏輯。 –
所以 - 大概這將涉及一個故事板沒有Segues定義。任何已定義的分段將被忽略? –
第二種方法似乎很好 - 但它在InstantiateViewCOntroller期間正在崩潰。無論如何,導航可能不太容易。 – Obiwan007