您的位置:首页 > 移动开发 > IOS开发

iOS语言中的代理模式

2015-06-30 11:11 471 查看
[b]什么是代理,为什么需要代理?[/b]

当某一个类或者试图控制器需要完成某些“动作”,但是却需要另一个类或者视图控制器作为其动作的载体。

[b]实际应用中的单例[/b]

比如当左侧滑栏leftViewController上有用户登录后显示的头像,点击头像会进入用户设置页面。而用户设置页面实际是需要从rootViewController push进入的。所以当用户点击左侧滑栏leftViewController上的用户头像时,需要左侧滑栏的代理rootViewController去执行创建用户设置页面并弹入的这一系列操作。这就是一个代理的实现。

[b]

[/b]

[b]

[/b]

在这个过程中,头像按钮是属于左侧滑栏leftViewController的点击事件,然而点击后的正真执行却是需要rootViewController来完成。那么leftViewController的作用就是在用户点击头像按钮的时候告诉系统,请让我的代理去执行点击按钮后的操作吧。

[b][b][b][b][b][b]用代码来实现一个代理[/b][/b][/b][/b][/b][/b]

首先第一步需要在leftViewController.h里做如下声明,@required表示其代理必须执行其下各个方法,@optional表示其代理可选择性的执行其下的方法

@protocol LeftMenuViewControllerDelegate <NSObject>

@required
- (void)userImageTap:(UIImageView *)sender;

@optional
- (void)loginButtonClicked:(UIButton *)sender;
.
.
.

@end

@interface LeftMenuViewController : UIViewController

@property (nonatomic, assign) id<LeftMenuViewControllerDelegate> delegate;

@end


然后需要在leftViewController.m中实现代理方法

- (void)userImageTap:(id)sender{
if ([_delegate respondsToSelector:@selector(userImageTap:)]) {
[_delegate userImageTap:sender];
}
}


最后需要在rootViewController中声明leftViewController.delegate = self 即rootViewController可以执行其具体的代理方法操作,最后执行需要执行的代理方法即可

_leftMenuVC.delegate = self;

- (void)userImageTap:(UIImageView *)sender{
[self pageReclaim];
AccountSettingViewController *accountVC = [[AccountSettingViewController alloc]initWithNibName:@"AccountSettingViewController" bundle:nil];
[self.navigationController pushViewController:accountVC animated:YES];
[accountVC release];
[self leftNavigationButtonClicked];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: