然后定义一个Protocol,按照Cocoa的习惯,一般它以delegate结尾,熟悉C#的同学应该知道它的意义。其实不论是接口,委托,还是回调函数,本质上都做了一件事情。就是定义了一个操作契约,然后由用户自己来实现它的具体内容。
@protocol MyUIViewDelegate
//这里只需要声明方法
- (void)func1
- (int)func2:(int)arg
@end
//这里只需要声明方法
- (void)func1
- (int)func2:(int)arg
@end
完成以上两步之后就需要设计自己的UIViewController了。一般简单的做法,可以让这个Controller来实现上面定义的MyUIViewDelegate。在Cocoa框架中,很多控件和它的Controller都是采用的这种方式。
@interface MyUIViewController : UIViewController <MyUIViewDelegate>
{
//成员变量
}
//成员方法,类方法,属性
@end
{
//成员变量
}
//成员方法,类方法,属性
@end
定义都完成了,到这里其实还看不出这三者是怎么联系起来的。那接下来就要看看,MyUIView和MyUIViewController的具体实现了。
首先是MyUIView的实现代码,假设在MyUIView在发生某个事件后会调用doSometing方法。
- (void)doSomething
{
if( delegate != nil ) //这里的delegate就是UIView定义时候的一个委托对象
{
[delegate func1]; //[]表示对一个对象发消息,如果在Java中会写成delegate.func1()
}
}
{
if( delegate != nil ) //这里的delegate就是UIView定义时候的一个委托对象
{
[delegate func1]; //[]表示对一个对象发消息,如果在Java中会写成delegate.func1()
}
}
上面的代码中 nil 相当于 Java中的 null,这里的意思就很明显了,如果delegate委托对象不为空,则调用相应的方法,但是这个委托对象的方法在哪里实现呢。可以看一下MyUIViewController的定义,它实现了MyUIViewDelegate。所以这个方法当然是由它来实现。代码如下
- (id)init
{
MyUIView *myView = [[MyUIView alloc] init]; //对MyUIView进行初始化
myView.delegate = self; //将MyUIViewController自己的实例作为委托对象
self.view = myView;
}
- (void)func1
{
//具体实现,可以加入Model相关的代码
}
{
MyUIView *myView = [[MyUIView alloc] init]; //对MyUIView进行初始化
myView.delegate = self; //将MyUIViewController自己的实例作为委托对象
self.view = myView;
}
- (void)func1
{
//具体实现,可以加入Model相关的代码
}
这么一来整个,整个代码的线路就明白了。
1.MyUIViewController初始化
2.MyUIViewController初始化时初始化MyUIView,并且将自己作为委托对象赋值给MyUIView
3.MyUIView发生事件,调用(回调)委托对象的方法,其实就是调用MyUIViewController的方法。