Monotouch:了解委托机制模式

Posted

技术标签:

【中文标题】Monotouch:了解委托机制模式【英文标题】:Monotouch: understand the delegate mechanism pattern 【发布时间】:2011-03-02 08:49:29 【问题描述】:

我没有完全理解 monotouch 中的委托机制。谁能帮我理解这个概念?

问题很简单。我将尝试在 Monotouch 中映射我在 Objective C 中所做的工作。

例如,假设我在 MyController 内的 Objective C 中创建了一个 UIPopoverController。在 Objective C 中,代码如下:

@interface MyController : UIViewController <UIPopoverControllerDelegate> 
    // ...

// ...
@end

MyController 内部,我可以创建UIPopoverController,如下所示:

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

最后是委托中使用的方法。

那么,Monotouch 呢?

通过这段代码,我可以在 MyController 类中实例化 UIPopoverController,该类在特定的 TouchUpInside 事件处理程序中扩展 UIViewController

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

附:一个重要的方面是将 popover 引用作为成员类而不是作为处理程序中的局部变量,因为 monotouch GC 运行良好!!!

提前谢谢你。

【问题讨论】:

我的第一个解决方案有效。我已经实现了一个扩展 UIPopoverControllerDelegate 的 CustomPopoverController。然后我添加了该控制器的一个实例作为 popover.delegate。是否可以作为委托 MyControllerCustomController 您的解决方案看起来如何?我能看到的唯一事件是 DidDismissWillReposition ... 没那么多。 【参考方案1】:

这确实与 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
;

希望这是您正在寻找的。​​p>

【讨论】:

【参考方案2】:

这并不能回答您特定于您的UIPopovercontroller 的问题我想您会发现this link from the Monotouch Docs useful. 它解释了Objective-C 委托和C# 委托与Monotouch 相关的区别。关于您的具体问题,我没有时间编写一个快速测试用例来完全理解它,但我想我会发布该链接,以便您同时阅读一些内容!

【讨论】:

以上是关于Monotouch:了解委托机制模式的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin学习之委托机制

javascript事件委托机制详解

iOS常用设计模式和机制之代理

JS事件冒泡机制以及委托方法,以及vue中的stop

kotlin中委托的概念和原理

应用程序委托问题,MonoTouch