2011-03-02 31 views
1

我沒有完全理解monotouch中的委託機制。任何人都可以幫助我理解這個概念嗎?Monotouch:瞭解委託機制模式

問題很簡單。我將嘗試映射我在Monotouch中Objective C中完成的工作。

例如,假設我在MyController的Objective C中創建了UIPopoverController。在目標C的代碼如下:

@interface MyController : UIViewController <UIPopoverControllerDelegate> { 
    // ... 
} 
// ... 
@end 

裏面MyController我可以istantiate一個UIPopoverController如下所示:在委託使用

UIPopoverController *popover = // ... 
popover.delegate = self; 

和最後的方法。

那麼,Monotouch呢?

通過這個代碼,我可以istantiate延伸UIViewController特定TouchUpInside事件處理程序內的UIPopoverControllerMyController類:

popover = new UIPopoverController(new CustomController()); 
popover.PopoverContentSize = new SizeF(200f, 200f); 
popover.PresentFromRect(button.Frame, containerForButtonView, UIPopoverArrowDirection.Left, true); 

附:一個重要的方面是將popover引用作爲成員類,而不是處理程序內的局部變量,因爲monotouch GC工作正常!

預先感謝您。

+0

我的第一個解決方案有效。我已經實現了一個擴展了UIPopoverControllerDelegate的CustomPopoverController。然後我添加了popover.delegate該控制器的一個實例。是否有可能作爲代表** MyController **或** CustomController **? – 2011-03-02 09:03:34

+0

您的解決方案看起來如何?我能看到的唯一事件是'DidDismiss'和'WillReposition' ......並不是那麼多。 – testing 2014-11-25 10:23:35

回答

3

對於C#,這確實比MonoTouch本身更多。在MonoTouch中,UIPopoverControllerDelegate是一個類,而C#不允許多重繼承,因此您無法使用Obj-C將代碼一對一地翻譯。有可能性,但一個更簡單的方法(下面的代碼編譯,但顯然是行不通的):

public class MyController: UIViewController { 
     public void mymethod(){ 
      var popover = new UIPopoverController(); 
      popover.DidDismiss += HandlePopoverDidDismiss; 
      popover.PopoverContentSize = new SizeF(200f, 200f); 
      popover.PresentFromRect(button.Frame, containerForButtonView, UIPopoverArrowDirection.Left, true); 
     } 

     void HandlePopoverDidDismiss (object sender, EventArgs e) 
     { 
      Console.WriteLine("Working!"); 
     } 
    } 
} 

正如你所看到的,你可以添加一個事件處理程序的酥料餅的DidDismiss事件,這將做什麼你要。一般來說,在所有控件中的代理處理Obj-C中的所有事件都可以這樣使用。你也可以寫的方法直列,像這樣:

popover.DidDismiss += delegate { 
    //dosomething 
}; 

希望這是你在找什麼。

2

這並不回答你的問題,具體到你的UIPopovercontroller我想你會發現this link from the Monotouch Docs useful.它解釋了Objective-C代表和C#代表與MonoTouch的區別。關於你的具體問題,我沒有時間去匆匆測試一個快速的測試案例來完全理解它,但是我想我會發布這個鏈接,以便你能夠在這段時間閱讀某些內容!