我正在尝试添加一些错误处理(以便在初始化我的视图模型以及其他地方时应对丢失的网络连接),让它发布一条由我的视图模型拾取的消息然后执行{ {1}} ChangePresentation
导致我的演示者(源自PresentationHint
)执行此操作:
MvxTouchViewPresenter
这种情况偶尔会有效,但很多时候它都没有效果,卡在当前正在播放的任何视图上,我看到了消息this.MasterNavigationController.PopToRootViewController(false);
。我相信这是因为有时候在加载的视图有时间完成加载之前会抛出消息(实际的数据加载是异步的并且在另一个线程上启动 - 因此问题)。
所以我的问题是,有没有办法同步这个,这样它不会立即弹出到root,它会完成它正在做的事情,然后弹出到root?或者有更好的方法来处理这个问题?
答案 0 :(得分:0)
你的问题中没有足够的代码可以解决正在发生的事情。 StackOverflow上有其他问题的很多包含该错误消息 - 可能值得查看它们以查看是否有一个很好的解决方案来解决您的问题。例如UINavigationController popToRootViewController, and then immediately push a new view
如果您确实想要检测“完成加载”,那么在这样做的过程中,请监听正在显示的ViewControllers中的ViewDidAppear消息。在mvx中,这很容易做到,因为所有ViewController都支持您可以轻松连接到自定义演示者的ViewDidAppearCalled
事件:
private readonly Queue<Action> _pendingActions = new Queue<Action>();
private bool _isBusy;
public override void Show(Cirrious.MvvmCross.Touch.Views.IMvxTouchView view)
{
if (_isBusy)
{
_pendingActions.Enqueue(() => Show(view));
return;
}
_isBusy = true;
var eventSource = view as IMvxEventSourceViewController;
eventSource.ViewDidAppearCalled += OnViewAppeared;
base.Show(view);
}
private void OnViewAppeared(object sender, MvxValueEventArgs<bool> mvxValueEventArgs)
{
_isBusy = false;
var eventSource = sender as IMvxEventSourceViewController;
eventSource.ViewDidAppearCalled -= OnViewAppeared;
if (!_pendingActions.Any())
return;
var action = _pendingActions.Dequeue();
action();
}
public override void ChangePresentation(Cirrious.MvvmCross.ViewModels.MvxPresentationHint hint)
{
if (_isBusy)
{
_pendingActions.Enqueue(() => ChangePresentation(hint));
return;
}
base.ChangePresentation(hint);
}
注意:此代码需要3.0.13或更高版本才能运行(早期版本的某些视图控制器中存在ViewDidAppear
的错误)
如果您使用的是简单的UINavigationController,另一种实现类似效果的方法是使用该控制器上的Delegate - 请参阅https://developer.apple.com/library/ios/documentation/uikit/reference/UINavigationControllerDelegate_Protocol/Reference/Reference.html