MVC架構(gòu)模式傳遞數(shù)據(jù)的幾種方式(OC)

1.模型M向控制器C傳遞數(shù)據(jù)

2.控制器C更新模型M數(shù)據(jù)

3.視圖V從控制器C獲取數(shù)據(jù)

4.控制器C更新視圖V數(shù)據(jù)

5.視圖V向控制器C傳遞數(shù)據(jù)

6.控制器C調(diào)用視圖V方法

7.模型M向視圖V傳遞數(shù)據(jù)

8.視圖V向控制器C傳遞數(shù)據(jù)(使用代理模式)

======================================================

1.控制器C向視圖V傳遞數(shù)據(jù)

控制器C可以通過以下方式向視圖V傳遞數(shù)據(jù):

@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創(chuàng)建了一個UserView對象,并通過設(shè)置其屬性來傳遞數(shù)據(jù)。視圖V可以通過訪問屬性來獲取數(shù)據(jù)。

2.控制器C從視圖V獲取數(shù)據(jù)

控制器C可以通過以下方式從視圖V獲取數(shù)據(jù):

@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實(shí)現(xiàn)了UITextFieldDelegate協(xié)議中的textFieldDidEndEditing:方法,當(dāng)文本框結(jié)束編輯時,控制器C從文本框中獲取數(shù)據(jù)。

3.控制器C向模型M傳遞數(shù)據(jù)

控制器C可以通過以下方式向模型M傳遞數(shù)據(jù):

@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實(shí)現(xiàn)了UITextFieldDelegate協(xié)議中的textFieldDidEndEditing:方法,當(dāng)文本框結(jié)束編輯時,控制器C從文本框中獲取數(shù)據(jù),并將數(shù)據(jù)存儲在模型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類,當(dāng)模型M中的數(shù)據(jù)發(fā)生變化時,模型M會通知控制器C,控制器C可以在observeValueForKeyPath:ofObject:change:context:方法中處理事件。

控制器C可以通過addObserver:forKeyPath:options:context:方法將自己注冊為觀察者,當(dāng)指定的keyPath發(fā)生變化時,控制器C的observeValueForKeyPath:ofObject:change:context:方法就會被調(diào)用。

5.視圖V向控制器C傳遞事件

視圖V可以通過委托模式或響應(yīng)者鏈向控制器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 {
    //處理按鈕點(diǎn)擊事件
}
@end

這個例子中,視圖V是UserView類,控制器C是UserController類,當(dāng)視圖V的按鈕被點(diǎn)擊時,視圖V會通過NSNotificationCenter向全局通知中心發(fā)送一個名為"UserViewButtonTapped"的通知,控制器C可以通過addObserver:selector:name:object:方法將自己注冊為觀察者,當(dāng)指定的通知被發(fā)送時,控制器C的userViewButtonTapped方法就會被調(diào)用,從而處理按鈕點(diǎn)擊事件。

6.控制器C向模型M傳遞數(shù)據(jù)

控制器C可以通過模型M的setter方法向模型M傳遞數(shù)據(jù),例如:

@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傳遞數(shù)據(jù)。在viewDidLoad方法中,控制器C創(chuàng)建了一個新的UserModel實(shí)例,并設(shè)置了name和age屬性的初始值。在updateUserModel方法中,控制器C更新了UserModel實(shí)例的name和age屬性的值??刂破鰿可以通過調(diào)用模型M的getter方法獲取數(shù)據(jù)。

7.模型M向控制器C傳遞數(shù)據(jù)

模型M可以通過代理模式向控制器C傳遞數(shù)據(jù),例如:

@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通過設(shè)置代理屬性并實(shí)現(xiàn)代理協(xié)議,向控制器C傳遞數(shù)據(jù)。在viewDidLoad方法中,控制器C創(chuàng)建了一個新的UserModel實(shí)例,并設(shè)置了delegate屬性為自身,同時也設(shè)置了name和age屬性的初始值。在模型M的setter方法中,模型M會通過代理方法向控制器C傳遞數(shù)據(jù)。當(dāng)模型M的name屬性或age屬性發(fā)生變化時,模型M會調(diào)用delegate屬性的userModelDidUpdateName:或userModelDidUpdateAge:方法,控制器C可以在實(shí)現(xiàn)這些代理方法中處理數(shù)據(jù)更新事件。

8.視圖V向控制器C傳遞數(shù)據(jù)

視圖V可以通過代理模式向控制器C傳遞數(shù)據(jù),例如:

@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通過設(shè)置代理屬性并實(shí)現(xiàn)代理協(xié)議,向控制器C傳遞數(shù)據(jù)。在UserView類中,當(dāng)文本框編輯結(jié)束時,視圖V會通過代理方法向控制器C傳遞數(shù)據(jù)。在UserView的nameTextFieldDidEndEditing:方法和ageTextFieldDidEndEditing:方法中,視圖V會調(diào)用delegate屬性的userViewDidUpdateName:和userViewDidUpdateAge:方法,控制器C可以在實(shí)現(xiàn)這些代理方法中處理數(shù)據(jù)更新事件。在控制器C的viewDidLoad方法中,控制器C創(chuàng)建了一個新的UserView實(shí)例,并設(shè)置了delegate屬性為自身。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容