r ;
[view performClick] ;
}
return 0;
}
首先创建了一个UIView对象view, 然后调用performClick函数,此时view没有设置delegate,但是由于自己实现了ButtonClickDelegate协议,因此可以为自己代理该点击事件。然后我们创建了ViewController对象controller, 并且将该对象设置为view对象的delegate, 然后执行performClick函数,此时在performClick函数中
会执行ViewController中的onClick函数,即controller代理了view的点击事件处理。输出结果如下 :
点击view的默认处理函数.
ViewController来实现点击事件
delegate与Java中的Listener
delegate与Java中的Listener的功能大致是相同的,比如我们看看Android中一个按钮的点击事件的处理。
Button mJumpButton = (Button) findViewById(R.id.button_jump);
mJumpButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,
SecondActivity.class);
startActivity(intent);
}
});
其中的Button就相当于上文中的UIView,而其setOnClickListener就相当于delegate属性的设置方法,OnClickListener就扮演了上文中ButtonClickDelegate的角色,
onClick方法更是如出一辙。其实每个平台大体上的设计思路也都是很相近的,观察不同平台的对比实现更容易理解吧。
delegate与id类型
我们在声明一个delegate对象是的形式是如下这样的 :
// 点击事件代理,因此UIView实现了ButtonClickDelegate协议,因此自己可以为自己代理。
@property (nonatomic, strong) id
clickDelegate ;
注意这里的类型是id
;这表明该delegate对象可以是任意类型,但是该类型必须实现ButtonClickDelegate
协议,也可以说成该类型必须采用正式协议ButtonClickDelegate。这个就很像Java中的泛型,例如我们可以在Java中这样使用泛型,
void setData(List
myorders) ;在setData函数中接受的参数为元素类型为Order子类的List集合,与id
是不是又很相似呢?