浅谈Xamarin.iOS里的协议、代理和事件

我们在实际中的开发中委托和协议使用的非常频繁,直接我们在C#中,定义一个类去集成接口或者类,然后实现该接口和类里面的方法,这样重写已实现我们自己的业务需求,但是我们在Xamarin.iOS开发中我们发现我们定义的控制器已经继承了UIViewController这个类,那我们怎么去实现协议的继承,方法的重写和委托的设置呢?


首先我们介绍一下协议(protocol)和代理(delegate)

我们可以通过下面这一段来自官网中对委托和协议的介绍:

Delegates are similar in concept to delegates in C#, but instead of defining and calling a single method, a delegate in Objective-C is an entire class that conforms to a protocol. A protocol is similar to an interface in C#, except that its methods can be optional. So for example, in order to populate a UITableView with data, you would create a delegate class that implements the methods defined in the UITableViewDataSource protocol that the UITableView would call to populate itself.

代理( delegate)就像C#里面代理的概念,但是没有了后边定义的执行方法,在OC里面的代理就是一个遵守协议的类。协议(protocol)就像C#里面的接口( interface),但是里面的方法都是必须执行的。
protocol-协议,就是使用了这个协议后就要按照这个协议来办事,协议要求实现的方法就一定要实现。
delegate-委托,顾名思义就是委托别人办事,就是当一件事情发生后,自己不处理,让别人来处理。
注意以下几点:
1.OC协议声明了可以被任何类实现的方法;Xamarin中方法必须实现。
2..OC协议不是类,它是定义了一个其他对象可以实现的接口;Xamarin中类似抽象类的用法
3.OC中委托直接设置为self(self这个类遵守了这个协议即可);Xamarin中必须自定义一个委托类去遵守这个协议,重写他的方法,再把这个类设置为委托。
4.如果在某个类中遵守了协议,实现了协议中的某个方法,也就是这个类实现了那个协议。

在OC里面通常这样实现代理和协议

A_View.h:  
@interface:UIViewController  
{  
B_View *myB_View;  
}  
@end  
A_View.m:  
- (void)viewWillAppear:(BOOL)animated    
{    
myB_View.touchDelegate = self; //设置委托 ,这里可以看出委托其实也可以理解为B_View中的一个属性   
[self.view addSubview: myB_View];    
}    
这样我们知道在C#中并不支持多继承,我们没法在在当前这个控制器的类中,继续继承这个协议类,这样我们需要换个方法去实现这个过程
浅谈Xamarin.iOS里的协议、代理和事件_第1张图片
Paste_Image.png
这里我们需要自定义个一个类去继承这个协议类,然后将这个类的实例去设置为委托,从而当响应这个方法的时候,会自动调用这个类中重写的方法。
浅谈Xamarin.iOS里的协议、代理和事件_第2张图片
Paste_Image.png
浅谈Xamarin.iOS里的协议、代理和事件_第3张图片
Paste_Image.png
这样就能实现这个过程代理模式。

下面再谈一谈事件(Events)

我们这里就拿按钮的点击事件来举例:
在OC中按钮的点击事件

    UIButton *button = [[UIButton alloc] init];
    [button addTarget:self action:@selector(didCickedBtn) forControlEvents:UIControlEventTouchUpInside];
//按钮的点击事件实现
-(void)didCickedBtn{
    NSLog(@"Xamarin is a pit!");
}

在Xamarin中按钮的点击事件
Xamarin为我们提供了C#和类似OC的方式去实现:
1.C#方式

//1.用C#中的委托语法
UIButton button =new UIButton ();
button.TouchDown += delegate {    
    Console.WriteLine ("Xamarin is a pit!");
};
//2.使用lambdas表达式
button.TouchTown += () => {
   Console.WriteLine ("Xamarin is a pit!");
};
//3.定义一个方法去给多个按钮绑定事件
button1.TouchDown += handler;
button2.TouchDown += handler;
void handler (object sender, EventArgs args)
{
   if (sender == button1)
      Console.WriteLine ("button1");
   else
      Console.WriteLine ("some other button");
}

2.类似OC方式

button.AddTarget (this, new Selector ("MySelector"), UIControlEvent.TouchDown);
[Export ("MySelector")]
void MyObjectiveCHandler ()
{
    Console.WriteLine ("Hello!");
}

如果有问题,欢迎大家留言告诉我。

——End 有问题可以加我微信,大家一起讨论

浅谈Xamarin.iOS里的协议、代理和事件_第4张图片

你可能感兴趣的:(浅谈Xamarin.iOS里的协议、代理和事件)