1.模型M向控制器C传递数据
2.控制器C更新模型M数据
3.视图V从控制器C获取数据
4.控制器C更新视图V数据
5.视图V向控制器C传递数据
6.控制器C调用视图V方法
7.模型M向视图V传递数据
8.视图V向控制器C传递数据(使用代理模式)
======================================================
1.控制器C向视图V传递数据
控制器C可以通过以下方式向视图V传递数据:
@interface UserController : UIViewController
@property (nonatomic, strong) UserView *userView;
@end
@implementation UserController
- (void)viewDidLoad {
[super viewDidLoad];
self.userView = [[UserView alloc] initWithFrame:self.view.bounds];
self.userView.nameLabel.text = @"Tom";
self.userView.ageLabel.text = @"18";
[self.view addSubview:self.userView];
}
@end
控制器C创建了一个UserView对象,并通过设置其属性来传递数据。视图V可以通过访问属性来获取数据。
2.控制器C从视图V获取数据
控制器C可以通过以下方式从视图V获取数据:
@interface UserController : UIViewController <UITextFieldDelegate>
@property (nonatomic, strong) UserView *userView;
@end
@implementation UserController
- (void)viewDidLoad {
[super viewDidLoad];
self.userView = [[UserView alloc] initWithFrame:self.view.bounds];
self.userView.nameTextField.delegate = self;
self.userView.ageTextField.delegate = self;
[self.view addSubview:self.userView];
}
- (void)textFieldDidEndEditing:(UITextField *)textField {
if (textField == self.userView.nameTextField) {
NSLog(@"name:%@", textField.text);
} else if (textField == self.userView.ageTextField) {
NSLog(@"age:%@", textField.text);
}
}
@end
控制器C实现了UITextFieldDelegate协议中的textFieldDidEndEditing:方法,当文本框结束编辑时,控制器C从文本框中获取数据。
3.控制器C向模型M传递数据
控制器C可以通过以下方式向模型M传递数据:
@interface User : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;
@end
@interface UserController : UIViewController
@property (nonatomic, strong) User *user;
@property (nonatomic, strong) UserView *userView;
@end
@implementation UserController
- (void)viewDidLoad {
[super viewDidLoad];
self.user = [[User alloc] init];
self.userView = [[UserView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:self.userView];
}
- (void)textFieldDidEndEditing:(UITextField *)textField {
if (textField == self.userView.nameTextField) {
self.user.name = textField.text;
} else if (textField == self.userView.ageTextField) {
self.user.age = [textField.text integerValue];
}
}
@end
控制器C实现了UITextFieldDelegate协议中的textFieldDidEndEditing:方法,当文本框结束编辑时,控制器C从文本框中获取数据,并将数据存储在模型M中。
4.模型M向控制器C传递事件
模型M可以通过观察者模式向控制器C传递事件,例如:
@interface User : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;
@end
@interface UserController : UIViewController
@property (nonatomic, strong) User *user;
@property (nonatomic, strong) UserView *userView;
@end
@implementation UserController
- (void)viewDidLoad {
[super viewDidLoad];
self.user = [[User alloc] init];
self.userView = [[UserView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:self.userView];
[self.user addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];
[self.user addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew context:nil];
}
- (void)dealloc {
[self.user removeObserver:self forKeyPath:@"name"];
[self.user removeObserver:self forKeyPath:@"age"];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if (object == self.user && [keyPath isEqualToString:@"name"]) {
NSString *newName = change[NSKeyValueChangeNewKey];
NSLog(@"name:%@", newName);
} else if (object == self.user && [keyPath isEqualToString:@"age"]) {
NSInteger newAge = [change[NSKeyValueChangeNewKey] integerValue];
NSLog(@"age:%ld", newAge);
}
}
- (void)buttonTapped {
self.user.name = @"Tom";
self.user.age = 18;
}
@end
这个例子中,模型M是User类,控制器C是UserController类,当模型M中的数据发生变化时,模型M会通知控制器C,控制器C可以在observeValueForKeyPath:ofObject:change:context:方法中处理事件。
控制器C可以通过addObserver:forKeyPath:options:context:方法将自己注册为观察者,当指定的keyPath发生变化时,控制器C的observeValueForKeyPath:ofObject:change:context:方法就会被调用。
5.视图V向控制器C传递事件
视图V可以通过委托模式或响应者链向控制器C传递事件,例如:
@interface UserView : UIView
@property (nonatomic, strong) UIButton *button;
@end
@implementation UserView
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
self.button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
[self.button addTarget:self action:@selector(buttonTapped) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:self.button];
}
return self;
}
- (void)buttonTapped {
[[NSNotificationCenter defaultCenter] postNotificationName:@"UserViewButtonTapped" object:self];
}
@end
@interface UserController : UIViewController
@property (nonatomic, strong) UserView *userView;
@end
@implementation UserController
- (void)viewDidLoad {
[super viewDidLoad];
self.userView = [[UserView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:self.userView];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(userViewButtonTapped) name:@"UserViewButtonTapped" object:nil];
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void)userViewButtonTapped {
//处理按钮点击事件
}
@end
这个例子中,视图V是UserView类,控制器C是UserController类,当视图V的按钮被点击时,视图V会通过NSNotificationCenter向全局通知中心发送一个名为"UserViewButtonTapped"的通知,控制器C可以通过addObserver:selector:name:object:方法将自己注册为观察者,当指定的通知被发送时,控制器C的userViewButtonTapped方法就会被调用,从而处理按钮点击事件。
6.控制器C向模型M传递数据
控制器C可以通过模型M的setter方法向模型M传递数据,例如:
@interface UserModel : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;
@end
@implementation UserModel
@end
@interface UserController : UIViewController
@property (nonatomic, strong) UserModel *userModel;
@end
@implementation UserController
- (void)viewDidLoad {
[super viewDidLoad];
self.userModel = [[UserModel alloc] init];
self.userModel.name = @"Tom";
self.userModel.age = 18;
}
- (void)updateUserModel {
self.userModel.name = @"Jerry";
self.userModel.age = 19;
}
@end
控制器C是UserController类,模型M是UserModel类,控制器C可以通过setter方法向模型M传递数据。在viewDidLoad方法中,控制器C创建了一个新的UserModel实例,并设置了name和age属性的初始值。在updateUserModel方法中,控制器C更新了UserModel实例的name和age属性的值。控制器C可以通过调用模型M的getter方法获取数据。
7.模型M向控制器C传递数据
模型M可以通过代理模式向控制器C传递数据,例如:
@protocol UserModelDelegate <NSObject>
- (void)userModelDidUpdateName:(NSString *)name;
- (void)userModelDidUpdateAge:(NSInteger)age;
@end
@interface UserModel : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;
@property (nonatomic, weak) id<UserModelDelegate> delegate;
@end
@implementation UserModel
- (void)setName:(NSString *)name {
_name = name;
[self.delegate userModelDidUpdateName:name];
}
- (void)setAge:(NSInteger)age {
_age = age;
[self.delegate userModelDidUpdateAge:age];
}
@end
@interface UserController : UIViewController <UserModelDelegate>
@property (nonatomic, strong) UserModel *userModel;
@end
@implementation UserController
- (void)viewDidLoad {
[super viewDidLoad];
self.userModel = [[UserModel alloc] init];
self.userModel.delegate = self;
self.userModel.name = @"Tom";
self.userModel.age = 18;
}
- (void)userModelDidUpdateName:(NSString *)name {
//处理名称更新事件
}
- (void)userModelDidUpdateAge:(NSInteger)age {
//处理年龄更新事件
}
@end
在这个例子中,控制器C是UserController类,模型M是UserModel类,模型M通过设置代理属性并实现代理协议,向控制器C传递数据。在viewDidLoad方法中,控制器C创建了一个新的UserModel实例,并设置了delegate属性为自身,同时也设置了name和age属性的初始值。在模型M的setter方法中,模型M会通过代理方法向控制器C传递数据。当模型M的name属性或age属性发生变化时,模型M会调用delegate属性的userModelDidUpdateName:或userModelDidUpdateAge:方法,控制器C可以在实现这些代理方法中处理数据更新事件。
8.视图V向控制器C传递数据
视图V可以通过代理模式向控制器C传递数据,例如:
@protocol UserViewDelegate <NSObject>
- (void)userViewDidUpdateName:(NSString *)name;
- (void)userViewDidUpdateAge:(NSInteger)age;
@end
@interface UserView : UIView
@property (nonatomic, weak) id<UserViewDelegate> delegate;
@end
@implementation UserView
- (IBAction)nameTextFieldDidEndEditing:(UITextField *)textField {
[self.delegate userViewDidUpdateName:textField.text];
}
- (IBAction)ageTextFieldDidEndEditing:(UITextField *)textField {
[self.delegate userViewDidUpdateAge:[textField.text integerValue]];
}
@end
@interface UserController : UIViewController <UserViewDelegate>
@property (nonatomic, strong) UserView *userView;
@end
@implementation UserController
- (void)viewDidLoad {
[super viewDidLoad];
self.userView = [[UserView alloc] init];
self.userView.delegate = self;
}
- (void)userViewDidUpdateName:(NSString *)name {
//处理名称更新事件
}
- (void)userViewDidUpdateAge:(NSInteger)age {
//处理年龄更新事件
}
@end
在这个例子中,控制器C是UserController类,视图V是UserView类,视图V通过设置代理属性并实现代理协议,向控制器C传递数据。在UserView类中,当文本框编辑结束时,视图V会通过代理方法向控制器C传递数据。在UserView的nameTextFieldDidEndEditing:方法和ageTextFieldDidEndEditing:方法中,视图V会调用delegate属性的userViewDidUpdateName:和userViewDidUpdateAge:方法,控制器C可以在实现这些代理方法中处理数据更新事件。在控制器C的viewDidLoad方法中,控制器C创建了一个新的UserView实例,并设置了delegate属性为自身。
网友评论