2012-04-12 5 views
0

Ich habe zwei "verschachtelte" DialogViewControllers - eine "View" und eine "Edit". Beide rendern Daten aus einer internen Datenstruktur mit StringElements. In der DVC bearbeiten hänge ich das Changed Event des StringElements, um meine interne Datenstruktur zu aktualisieren. Ich hänge auch das ViewDisplayaring (sic) -Ereignis des Edit DVC an, um den View DVC erneut zu rendern und die Änderungen an einen Cloud-Dienst zu senden.Ist es möglich, die Reihenfolge von EventHandlern zu steuern, die für Ereignisse in MonoTouch.Dialog ausgelöst werden?

Mein Problem ist, dass der Changed Event-Handler nach dem ViewDissapearing Event-Handler aufgerufen wird, so dass meine interne Datenstruktur nicht rechtzeitig aktualisiert wird.

Der Code, der DVC sieht wie folgt aus etwas aufstellt:

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); 

Innen RenderEditItem(), füge ich StringElements auf der internen Datenstruktur basiert, und fügen Sie die geänderte Eventhandler in der üblichen Weise:

Gibt es eine Möglichkeit, die Changed-Ereignishandler vor dem ViewDissapearing-Ereignishandler ausgelöst werden?

+0

Derzeit besteht meine Problemumgehung darin, meinen ViewDissapearing -Ereignishandler-Code in einem NSTimer.CreateScheduledTimer (0.5, Delegat {}) einzubinden; Es ist hässlich, aber es ist der einzige Weg, den ich gefunden habe, um das Verhalten zu bekommen, das ich will ... –

Antwort

0

Gute Nachrichten! In der Version 5.2.11 von MonoTouch.Dialog wurde die Verhaltensweise des EntryElement.Changed-Ereignisses geändert - es wird nun für jeden Tastenanschlag ausgelöst, anstatt nur bei einer Fokusänderung. So kommt meine "Race Condition" nicht mehr vor und ich kann den NSTimer Hack jetzt eliminieren.

Ein damit verbundener Vorteil dieser Änderung besteht darin, dass Sie EntryElement.FetchValue() nicht mehr aufrufen müssen, um sicherzustellen, dass EntryElement.Value aktuell ist.

http://docs.xamarin.com/ios/releases/MonoTouch_5/MonoTouch_5.2#11 für weitere Informationen.

Verwandte Themen