public override void Close(IMvxViewModel toClose) { //We make an array of this to make a snapshot before modifying presentation hosts. var presentationHostsToDrop = (from host in presentationHosts where ((IMvxTouchView)host).ViewModel == toClose select host).ToArray(); foreach (var host in presentationHostsToDrop) { presentationHosts.Remove(host); } var viewsPresentedByHosts = removalAgentsByView.Keys; var relevantViewsPresentedByHosts = (from view in viewsPresentedByHosts where view.ViewModel == toClose select view).ToArray(); if (relevantViewsPresentedByHosts.Count() > 0) { foreach (var view in relevantViewsPresentedByHosts) { var removalAgent = removalAgentsByView [view]; removalAgent(); removalAgentsByView.Remove(view); } } else if (MasterNavigationController != null) { var topView = MasterNavigationController.TopViewController as IMvxView; IMvxViewModel topViewModel; if (topView != null) { topViewModel = topView.ReflectionGetViewModel(); } else { // #if DEBUG // MvxTrace.Warning ("Don't know how to close this ViewModel; topmost is not a touchview"); // #endif return; } if (topViewModel == toClose) { if (MasterNavigationController.ViewControllers.Length > 1) { MasterNavigationController.PopViewController(true); } else { MasterNavigationController.WillMoveToParentViewController(null); MasterNavigationController.RemoveFromParentViewController(); MasterNavigationController.View.RemoveFromSuperview(); MasterNavigationController = null; } } else { // #if DEBUG // MvxTrace.Warning ("Don't know how to close this ViewModel; topmost view does not present this viewmodel"); // #endif return; } } else { // #if DEBUG // MvxTrace.Warning("Don't know how to close this ViewModel; there are no views governed by the RichTouchPresenter or its MasterNavigationController"); // #endif } }