MVVM

作者: itclimb | 来源:发表于2023-08-23 14:51 被阅读0次
    MVVM.png
    Controller
    #import "ViewController.h"
    #import "MJAppViewModel.h"
    
    @interface ViewController ()
    @property (strong, nonatomic) MJAppViewModel *viewModel;
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        self.viewModel = [[MJAppViewModel alloc] initWithController:self];
    }
    
    @end
    
    ViewModel
    #import "MJAppViewModel.h"
    #import "MJApp.h"
    #import "MJAppView.h"
    
    @interface MJAppViewModel() <MJAppViewDelegate>
    @property (weak, nonatomic) UIViewController *controller;
    @property (copy, nonatomic) NSString *name;
    @property (copy, nonatomic) NSString *image;
    @end
    
    @implementation MJAppViewModel
    
    - (instancetype)initWithController:(UIViewController *)controller
    {
        if (self = [super init]) {
            self.controller = controller;
            
            // 创建View
            MJAppView *appView = [[MJAppView alloc] init];
            appView.frame = CGRectMake(100, 100, 100, 150);
            appView.delegate = self;
            appView.viewModel = self;
            [controller.view addSubview:appView];
            
            // 加载模型数据
            MJApp *app = [[MJApp alloc] init];
            app.name = @"QQ";
            app.image = @"QQ";
            
            // 设置数据
            self.name = app.name;
            self.image = app.image;
        }
        return self;
    }
    
    #pragma mark - MJAppViewDelegate
    - (void)appViewDidClick:(MJAppView *)appView
    {
        NSLog(@"viewModel 监听了 appView 的点击");
    }
    
    @end
    
    View .h
    #import <UIKit/UIKit.h>
    
    @class MJAppView, MJAppViewModel;
    
    @protocol MJAppViewDelegate <NSObject>
    @optional
    - (void)appViewDidClick:(MJAppView *)appView;
    @end
    
    @interface MJAppView : UIView
    @property (weak, nonatomic) MJAppViewModel *viewModel;
    @property (weak, nonatomic) id<MJAppViewDelegate> delegate;
    @end
    
    View .m
    #import "MJAppView.h"
    #import "NSObject+FBKVOController.h"
    
    @interface MJAppView()
    @property (weak, nonatomic) UIImageView *iconView;
    @property (weak, nonatomic) UILabel *nameLabel;
    @end
    
    @implementation MJAppView
    
    - (instancetype)initWithFrame:(CGRect)frame
    {
        if (self = [super initWithFrame:frame]) {
            UIImageView *iconView = [[UIImageView alloc] init];
            iconView.frame = CGRectMake(0, 0, 100, 100);
            [self addSubview:iconView];
            _iconView = iconView;
            
            UILabel *nameLabel = [[UILabel alloc] init];
            nameLabel.frame = CGRectMake(0, 100, 100, 30);
            nameLabel.textAlignment = NSTextAlignmentCenter;
            [self addSubview:nameLabel];
            _nameLabel = nameLabel;
        }
        return self;
    }
    
    - (void)setViewModel:(MJAppViewModel *)viewModel
    {
        _viewModel = viewModel;
        
        __weak typeof(self) waekSelf = self;
        [self.KVOController observe:viewModel keyPath:@"name" options:NSKeyValueObservingOptionNew block:^(id  _Nullable observer, id  _Nonnull object, NSDictionary<NSKeyValueChangeKey,id> * _Nonnull change) {
            waekSelf.nameLabel.text = change[NSKeyValueChangeNewKey];
        }];
        
        [self.KVOController observe:viewModel keyPath:@"image" options:NSKeyValueObservingOptionNew block:^(id  _Nullable observer, id  _Nonnull object, NSDictionary<NSKeyValueChangeKey,id> * _Nonnull change) {
            waekSelf.iconView.image = [UIImage imageNamed:change[NSKeyValueChangeNewKey]];
        }];
    }
    
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
    {
        if ([self.delegate respondsToSelector:@selector(appViewDidClick:)]) {
            [self.delegate appViewDidClick:self];
        }
    }
    
    @end
    
    Model
    @interface MJApp : NSObject
    @property (copy, nonatomic) NSString *name;
    @property (copy, nonatomic) NSString *image;
    @end
    

    相关文章

      网友评论

          本文标题:MVVM

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