与Monotouch中的事件,代表等混淆

hyd*_*dev 4 xamarin.ios

我来自一个非常熟练的Windows .NET背景,我正在使用Monotouch,我对如何回应事件感到非常困惑.我喜欢保持简单,我已经阅读了Montouch教程并查看了示例.我对此感到困惑的是如何回应事件.

假设我有一个带有UIButton和UILabel的ViewController.当我按下按钮时,我想将标签改为"点击按钮".

因此我可以做以下事情:

public override void ViewDidLoad () {
     base.ViewDidLoad ();
     this.btnClickMe.TouchUpInside += (sender, e) => {
         this.lblOutput.Text = "Clicked @ " + DateTime.Now.ToShortTimeString ();
}
Run Code Online (Sandbox Code Playgroud)

或者,我可以使用这种方法,我认为在响应按下NavigationBars等按钮时,我会更好地服务于我.在IB中我按Ctrl-拖动来创建动作.然后我将[Action]方法移动到我的.cs文件并执行以下操作.

[Action ("btnClickMe_TouchUpInside:")]
public void btnClickMe_TouchUpInside (NSObject sender)
{
    this.lblOutput.Text = "Clicked @ " + DateTime.Now.ToShortTimeString ();
}
Run Code Online (Sandbox Code Playgroud)

是什么让我更困惑的是一些UI组件有一个.delegate成员.我可以添加一个事件.

什么是最好的方法,还是我完全糊涂了?如果是这样,有一个链接,你可以指导我到哪里,我可以学习最佳实践,正确的方法等.

非常感谢

麦克风

Jac*_*hee 5

对于一个很好的介绍,我推荐Xamarin关于事件,协议和代表的文章.

至于您将Action Outlets与挂钩事件连接到Referencing Outlets的问题,他们有这样的说法:

使用.NET事件而不是目标操作之间的主要区别在于后者允许您将多个控件连接到单个操作方法.

所以,如果你正在构建一个快速而肮脏的计算器,你可能会倾向于使用动作方法,按下数字0-9都会做同样的事情 - 你只需从按钮读取数字即可.(如果您曾使用VB创建控件数组,那么您可能熟悉这种技术.)

也就是说,我发现我个人的偏好是坚持使用Reference Outlets.它需要较少的思考,并在MonoDevelop和Interface Builder之间来回转换.我放入一个UISlider并引用它,然后我可以从代码中访问它的所有属性和事件.因此,稍后可以通过代码完成挂钩.许多开发人员评论说他们不再使用IB ......

回顾事实,MonoTouch提供了多种与UI交互的冗余方式.对于那些来自Objective-C的人,你会发现熟悉的"Objective-C代表"和对"选择器"的引用.来自C#,您经常可以忽略这些方法.但是,您应该花时间阅读该文章,以便熟悉Apple文档中使用的语言.例如,重要的是要注意"Objective-C Delegates"和"C#delegates"之间的区别.

与.NET使用事件的方式类似,代理用于iOS中的回调.为了使iOS API及其使用Objective-C委托的方式看起来更像.NET,MonoTouch在许多地方公开.NET事件,其中代理在iOS中使用.

随着时间的推移,我相信您会发现API灵活且适应.NET模式.在NS类型和.NET类型之间进行转换通常是透明的(例如,从lambda表达式到NSAction).

如果您需要更具体的信息,请告诉我.干杯.