2011-12-22 75 views
2

我想等待一個控制器顯示與PresentModalViewController()來完成(在的WinForms像模態對話框)恢復執行前,它的工作。這怎麼能用monotouch完成?等待PresentModalViewController完成(MonoTouch的)

我知道有關於SO一similar question但得到的答覆是Objective-C的,坦率地說,我不明白這一點。

非常感謝。


編輯

這裏是我試圖和這似乎沒有工作,第一個設置:

  1. 創建一個新的項目(單一視圖應用);
  2. 添加兩個控制器(iPhone - 視圖 - 控制器):FirstController和SecondController;第一個控制器重寫DismissModalViewControllerAnimated並在被解散後立即觸發OnFirstFinished事件;
  3. 在主控制器:

...

public partial class TestModalViewController : UIViewController 
{ 
    private UIButton button; 
    private FirstController first; 
    private SecondController second; 

    public override void ViewDidLoad() 
    { 
     base.ViewDidLoad(); 

     button = UIButton.FromType(UIButtonType.RoundedRect); 
     button.Frame = new RectangleF(0, 0, 100, 50); 
     button.SetTitle("Test", UIControlState.Normal); 
     button.TouchUpInside += PresentFirstController; 

     View.Add(button); 

     PresentFirstController(null, null); 
    } 

    void PresentFirstController (object sender, EventArgs e) 
    { 
     bool firstFinished = false; 

     first = new FirstController(); 

     first.OnFirstFinished += delegate(object s, EventArgs args) { 
     firstFinished = true; 
     }; 

     this.PresentModalViewController(first, true); 

     do 
     { 
     NSRunLoop.Current.RunUntil (NSDate.FromTimeIntervalSinceNow (0.5)); 
     } while (!firstFinished); 

     second = new SecondController(); 
     this.PresentModalViewController(second, true); 

    } 

    // ... 
} 
  • 在FirstController:
  • ...

    public override void DismissModalViewControllerAnimated (bool animated) 
    { 
        base.DismissModalViewControllerAnimated (animated); 
    
        if(null != OnFirstFinished) 
        { 
         OnFirstFinished(this, null); 
        } 
    } 
    

    在此設置中,執行塊(bla ck加載屏幕)並且第一個控制器未加載。

    如果調用PresentFirstController()從viewDidLoad中(去除),主控制器加載罰款並點擊「測試」按鈕時,第一控制器被加載。然而,在第一個控制器被解僱後,第二個控制器沒有被加載 - iOS似乎不喜歡在解散另一個控制器之後提交模態控制器。這可以通過增加一個小的延遲來解決像下面(但有多小仍是安全的?):

    public override void DismissModalViewControllerAnimated (bool animated) 
    { 
        base.DismissModalViewControllerAnimated (animated); 
    
        NSRunLoop.Current.RunUntil (NSDate.FromTimeIntervalSinceNow(0.2)); 
    
        if(null != OnFirstFinished) 
        { 
         OnFirstFinished(this, null); 
        } 
    } 
    

    回答

    2

    一般情況下,要在iOS上使用的代碼模式是連鎖這些行動。例如,您的視圖控制器可能會有一個登錄名/密碼字段和一個按鈕來執行登錄。

    你會做什麼是連接登錄按鈕與服務器聯繫,驗證用戶的動作和憑據是否OK,關閉該對話框視圖控制器,並在該點恢復執行。

    這就是說,你可以提出視圖控制器和手動運行UI主循環,等待一些事件來恢復執行之前觸發。

    do { 
        NSRunLoop.Current.RunUntil (NSDate.FromTimeIntervalSinceNow (0.5)); 
    } while (!done); 
    

    您可以保存自己的一些疼痛,並與UIKit的模式,而不是試圖打他們構建你的代碼。你最終會節省時間。

    +0

    謝謝米格爾,但是這一次的鎖,就像所有其他的嘗試我在等待第一個模式被解僱。我使用的代碼序列是:1)創建第一個控制器並訂閱自定義的「OnFinished」事件; 2)PresentModalViewController()3)當「OnFinished」未觸發時執行UI循環; 4)爲它創建第二個控制器和PresentModalViewController()。問題是第一個控制器甚至沒有顯示,而執行被鎖定在循環中。沒有循環顯示第一個模式,但不會等待控制器被解僱。 – 2011-12-27 08:19:42

    +0

    實際上Miguel的建議確實有效,它僅在從ViewDidLoad()覆蓋中調用PresentModal()時才被阻止。稍後會發布一些代碼片段。 – 2011-12-27 09:01:57