美文网首页
MVC架构模式传递数据的几种方式(OC)

MVC架构模式传递数据的几种方式(OC)

作者: 田陌允 | 来源:发表于2023-03-28 14:58 被阅读0次

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属性为自身。

相关文章

网友评论

      本文标题:MVC架构模式传递数据的几种方式(OC)

      本文链接:https://www.haomeiwen.com/subject/tgwtddtx.html