0

我有两个“嵌套”DialogViewController——一个“视图”和一个“编辑”。两者都使用 StringElements 从内部数据结构呈现数据。在 Edit DVC 中,我挂钩 StringElement 的 Changed 事件以更新我的内部数据结构。我还挂钩了 Edit DVC 的 ViewDissapearing (sic) 事件以重新渲染 View DVC,并将编辑内容发送到云服务。

我的问题是在 ViewDissapearing 事件处理程序之后调用了 Changed 事件处理程序,因此我的内部数据结构没有及时更新。

设置 DVC 的代码如下所示:

    var root = RenderViewItem(ThisItem);            
    var dvc = new DialogViewController(root, true);

    // create an Edit button which pushes the edit view onto the nav stack
    dvc.NavigationItem.RightBarButtonItem = new UIBarButtonItem(UIBarButtonSystemItem.Edit, delegate {
        var editRoot = RenderEditItem(ThisItem, true /* render the list field */);
        editViewController = new DialogViewController(editRoot, true);
        editViewController.ViewDissapearing += (sender, e) => 
        { 
            // trigger a sync with the service when the view disappears                    
            App.ViewModel.SyncWithService(); 

            // reload the View page 
            dvc.BeginInvokeOnMainThread(() =>
            {
                var oldroot = root;
                root = RenderViewItem(ThisItem);
                dvc.Root = root;
                dvc.ReloadData();
                oldroot.Dispose();
            });
        };    
        controller.PushViewController(editViewController, true);
    });

    // push the "view item" view onto the nav stack
    controller.PushViewController(dvc, true);

在 RenderEditItem() 内部,我根据内部数据结构添加 StringElements,并按照通常的方式添加 Changed EventHandler:

stringElement.Changed += delegate { /* change a data structure */ };

有没有办法让 Changed 事件处理程序在 ViewDissapearing 事件处理程序之前触发?

4

1 回答 1

0

好消息!MonoTouch.Dialog 5.2.11 版对引发 EntryElement.Changed 事件的方式进行了行为更改 - 现在每次击键都会引发此事件,而不是仅在发生焦点更改时引发。所以我的“竞争条件”不再发生,我现在能够消除 NSTimer 黑客。

此更改的一个相关好处是您不再需要调用 EntryElement.FetchValue() 来确保 EntryElement.Value 是最新的。

http://docs.xamarin.com/ios/releases/MonoTouch_5/MonoTouch_5.2#11了解更多信息。

于 2012-05-02T05:45:01.193 回答