什么是代理,为什么需要代理?
当某一个类或者试图控制器需要完成某些“动作”,但是却需要另一个类或者视图控制器作为其动作的载体。
实际应用中的单例
比如当左侧滑栏leftViewController上有用户登录后显示的头像,点击头像会进入用户设置页面。而用户设置页面实际是需要从rootViewController push进入的。所以当用户点击左侧滑栏leftViewController上的用户头像时,需要左侧滑栏的代理rootViewController去执行创建用户设置页面并弹入的这一系列操作。这就是一个代理的实现。
在这个过程中,头像按钮是属于左侧滑栏leftViewController的点击事件,然而点击后的正真执行却是需要rootViewController来完成。那么leftViewController的作用就是在用户点击头像按钮的时候告诉系统,请让我的代理去执行点击按钮后的操作吧。
用代码来实现一个代理
首先第一步需要在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]; }
时间: 2024-10-01 07:38:42