MvvmCrossフレームワークを使用するMonoTouchアプリに、モーダル(NavigationController.PresentModalViewController)を表示したいビューがあります。
1 に答える
MvvmCrossは、すべてのViewModelが単なる「通常のページ」であるという前提から始まります。つまり、iOS / MonoTouchでは、UIViewControllerはUINavigationControllerを使用して表示されます。
この前提から離れて(タブ付きディスプレイ、モーダルディスプレイ、分割コントローラー、ポップアップなどに)移動するには、MonoTouchアプリ内でプレゼンターロジックを調整できます。
プレゼンターの仕事は、以下を実装することです。
public interface IMvxTouchViewPresenter
{
void Show(MvxShowViewModelRequest view);
void Close(IMvxViewModel viewModel);
void CloseModalViewController();
void ClearBackStack();
bool PresentModalViewController(UIViewController controller, bool animated);
void NativeModalViewControllerDisappearedOnItsOwn();
}
アプリに使用されるプレゼンターは、AppDelegateの構築で選択されます。たとえば、TwitterSearchがiPhoneとiPad用に異なるプレゼンターを構築する方法をご覧ください。
幸い、単純なモーダルサポートの場合、利用可能な標準プレゼンターの1つはMvxModalSupportTouchViewPresenter.csです。
このプレゼンターは、表示されているビューにIMvxModalTouchView
マーカーインターフェイスがあるかどうかを確認します-テストしますview is IMvxModalTouchView
。このインターフェースが存在する場合、「通常のナビゲーション」ではなく、ビューにモーダル表示を使用します。
これを使用するには、AppDelegateコードを次のように変更します。
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
window = new UIWindow(UIScreen.MainScreen.Bounds);
// initialize app for single screen iPhone display
var presenter = new MvxModalSupportTouchViewPresenter(this, window);
var setup = new Setup(this, presenter);
setup.Initialize();
// start the app
var start = this.GetService<IMvxStartNavigation>();
start.Start();
window.MakeKeyAndVisible();
return true;
}
次に、モーダルビューにマーカーインターフェイスを追加します。
public class MyView : MvxBindingTouchViewController<MyViewModel>, IMvxModalTouchView
{
// ....
}