我没有完全理解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运行良好!!!
提前谢谢。
答案 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
};
希望这是你正在寻找的。 p>
答案 1 :(得分:2)
这不能回答您特定于UIPopovercontroller
的问题我认为您会发现this link from the Monotouch Docs useful.它解释了与Monotouch相关的Objective-C代表和C#代理之间的差异。关于你的具体问题,我没有时间掀起一个快速的测试案例来完全理解它,但想到我发布了这个链接,所以你有同时阅读的内容!