delegate参数解析

D 在Cocoa里面很多对象的初始化都有一个delegate参数,例如初始化一个ActionSheet

[[UIActionSheet alloc]
   initWithTitle:@"标题"
   delegate:self
   cancelButtonTitle:@"取消按钮"
   destructiveButtonTitle:@"结束按钮"
   otherButtonTitles:nil];

这里就有一个delegate参数,而我给的例子里面的值是self。

那这个self是什么含义呢?

还有什么其他可行参数么?

答案如下:

1,正如delegate的中文含义是“事件代理”,这里就是要为ActionSheet找一个代理。那么如果写self,那就意味着本地对象和本地类就是这个ActionSheet的“事件代理”。那么我们就应该在这个本地类里面写delegate的方法来回应。例如:

- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex
{
}

2,本地类如果不是对象类的时候,是没有该对象()的事件代理解析能力的,这时该怎么办呢?那么就应该在本地类加入对象类的“事件代理”协议(接口),如下:

@interface aViewController : UIViewController <UIActionSheetDelegate>
{
}

这里的<UIActionSheetDelegate>就告诉本地类去接收并可以响应ActionSheet的“事件”

3,如果有多个ActionSheet在一个本地类中,这个事件代理该如果响应呢?

方法如下:

- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex
{
	if(actionSheet == 指定的actionSheet对象){}
}

事件代理方法的第一个参数就是发出事件代理的对象,所以可以进行比对后,作if参数调节。

4,delegate后可使用nil值。这个就表示该对象不被代理。

5,delegate后可以使用本地类可以访问的类对象,这样那个类对象就会收到ActionSheet的代理通知。例如:ClassB是ClassA的子类,ClassA中有一个需要代理的ActionSheet, ClassA可以通过这个delegate参数来指定ClassB作为这个ActionSheet的事件代理。

此贴暂时就到这里,以后会进行完善,并添加“屏播”解释。

Leave a Reply