Monotouch:了解委托机制模式

时间:2011-03-02 08:49:30

标签: delegates xamarin.ios uipopovercontroller

我没有完全理解monotouch中的委托机制。任何人都可以帮助我理解这个概念吗?

问题很简单。我将尝试绘制我在Monotouch中的Objective C中所做的事情。

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

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

MyController内,我可以像以下一样UIPopoverController

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

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

那么,Monotouch呢?

通过这段代码,我可以将UIPopoverController内部的MyController类扩展为在特定的TouchUpInside事件处理程序中扩展UIViewController的内容:

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

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

提前谢谢。

2 个答案:

答案 0 :(得分: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!");
        }
    }
}

如您所见,您可以向popover中的DidDismiss事件添加事件处理程序,这将执行您想要的操作。通常,Obj-C中的所有事件都由委托在所有控件中处理,可以这种方式使用。您也可以内联编写方法,如下所示:

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

希望这是你正在寻找的。

答案 1 :(得分:2)

这不能回答您特定于UIPopovercontroller的问题我认为您会发现this link from the Monotouch Docs useful.它解释了与Monotouch相关的Objective-C代表和C#代理之间的差异。关于你的具体问题,我没有时间掀起一个快速的测试案例来完全理解它,但想到我发布了这个链接,所以你有同时阅读的内容!