模态关闭

时间:2018-01-05 04:25:35

标签: c# xamarin xamarin.ios mvvmcross

我从UIApplication派生并覆盖SendEvent以捕获用户点击。 一切正常,除非关闭IMvxModalIosView类型的模态。

以下是方法:

public override void SendEvent(UIEvent uievent)
{
    NSSet touches = uievent.AllTouches;
    if (touches != null)
    {
        UITouch touch = (UITouch)touches.AnyObject;

        switch (touch.Phase)
        {
            case UITouchPhase.Ended:
                StartDoingStuffAgain();
                break;

            default:
                StopDoingStuff();
                break;
        }
    }

    base.SendEvent(uievent);
}

在关闭IMvxModalIosView时进行调试,如果我在方法的开头设置断点,以及StartDoingStuffAgain(),则后者会被命中。但是,如果我只在StartDoingStuffAgain()设置断点,它永远不会被击中。 StopDoingStuff()无论如何都会被击中。

为什么会这样?

编辑1:根据nmilcoff的更多代码请求:

[Register("AppDelegate")]
public partial class AppDelegate : MvxApplicationDelegate
{
    //...
    public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
    {
      //...
      _app = application as MyUIApplication;
      //...
    }
    //...
}

[Register("MyUIApplication")]
public class MyUIApplication : UIApplication
{
    //...
    // Bit of code in original question goes here.
    //...
}


//The iPad view presenter (iPhone has MyIPhoneViewPresenter)
public class MyIPadViewPresenter : MvxBaseIosViewPresenter
{
    //...
    private UINavigationController _navController;
    private UINavigationController _modalNavController;
    private IMvxMessenger _messenger;
    protected readonly SemaphoreSlim _autoLock = new SemaphoreSlim(1, 1);
    //...

    public override async void Show(MvxViewModelRequest request)
    {
        await _autoLock.WaitAsync();
        //...
        if(_messenger == null)
        {
            _messenger = Mvx.Resolve<IMvxMessenger>();
        }

        // Among other things, the following method checks if the page
        // corresponding to the VM request is a Xamarin.Forms or a native view.
        var presentation = MvxIOSPresentationHelpers.CreateView(request, TargetIdiom.Tablet);

        switch(presentation.Type)
        {
            //...
            case ViewType.ModalWithNav:
                showNavModalView(presentation.ViewController);
                break;
            //...
        }
        messenger.Publish(new ViewModelShowMessage(request.ViewModelType, presentation.ViewController, this));          
        //..
        _autoLock.Release();
    }
    //...
    private void showNavModalView(UIViewController viewController)
    {
        if(_modalNavController == null)
        {
            _modalNavController = new ModalNavController(viewController);
            _modalNavController.ModalPresentationStyle = viewController.ModalPresentationStyle;
            _navController.PresentViewController(_modalNavController, false, delegate { });
        }
        else
        {
            _modalNavController.PushViewController(viewController, true);
        }
        //...
    }
    //...
    public override async void ChangePresentation(MvxPresentationHint hint)
    {
        var close_hint = hint as MvxClosePresentationHint;
        if (close_hint != null)
        {
            await _autoLock.WaitAsync();
            close(close_hint.ViewModelToClose);
            _autoLock.Release();
        }
        else
        {
            //...
        }
    }
    //...
    protected void close(IMvxViewModel toClose)
    {
        //...
        _messenger.Publish(new MvxMessage(this));
        //...
        if (_modalNavController != null)
        {
            if(_modalNavController.ChildViewControllers.Length <= 1)
            {
                // This is where the close sequence comes down to.
                _modalNavController.DismissViewController(true, delegate{ });
                _modalNavController = null;
            }
            else
            {
                //...
            }
            return;
        }
        //..
    }
    //...
}


// The VM corresponding to the IMvxModalIosView
public class MyProblematicModalVM : MvxViewModel
{
    //...
    public ICommand CloseCommand
    {
        get { return new MvxCommand(() => Close(this)); }
    }
    //...
}

0 个答案:

没有答案