iOS开发 「RAC」RAC常见宏方法的妙用

iOS开发 「RAC」RAC常见宏方法的妙用,第1张

RAC(TARGET, [KEYPATH, [NIL_VALUE]]) :用于给某个对象的某个属性绑定

RACObserve(TARGET, KEYPATH) :监听某个对象的某个属性,返回的是一个信号

@weakify(Obj) 与 @strongify(Obj) ,这两个一般是配套使用,解决循环引用问题

RACTuplePack :把数据包装成RACTuple(元组类),被包装的数据必须是 object类数据

RACTupleUnpack :把RACTuple(元组类)解包成对应的数据,解包参数的顺序及数据类型要和包装数据时的顺序及类型保持一致

本文介绍两个开发中常用的场景,第一个是UITableView列表界面通过网络请求数据展示数据,第二个是登录功能。功能比较基础,但都是精髓。分享一下笔者对MVVM的一些见解,在此抛砖引玉,希望能对广大开发者提供一点思路。

效果如上图,实现此功能用到的类:

1、OrderController

OrderController主要讲的是ViewModelEvent中的方法,其他也没什么可说的

2、RequestViewModel:主要向控制器提供数据,通知tableView刷新界面

RequestViewModel.h

RequestViewModel.m

3、OrderCell和OrderModel

跟之前MVC做法完全一致,其实没什么好说的

OrderCell.h

OrderCell.m

OrderModel.h

效果如上图,实现此功能用到的类:

1、LoginController

2、LoginViewModel

前提条件,存在A和B两个页面,A是主界面,A push 到 B

方法一:如果B页面的返回按钮要用自定义的按钮(在iOS7中,如果使用了UINavigationController,那么系统自带的附加了一个从屏幕左边缘开始滑动可以实现pop的手势。但是,如果自定义了navigationItem的leftBarButtonItem,那么这个手势就会失效。)

在A界面:

- (void)viewDidAppear:(BOOL)animated {

self.navigationController.interactivePopGestureRecognizer.delegate = (id)self//重新设置代理

self.navigationController.interactivePopGestureRecognizer.enabled = NO//本页面不能右滑

}

在B里面:

设置返回按钮:

UIButton *backBtn = [UIButton buttonWithType:UIButtonTypeCustom]

backBtn.frame = CGRectMake(5, 2, 21, 35)

[backBtn setImage:[UIImage imageNamed:@"back"] forState:UIControlStateNormal]

[[backBtn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {

[self.navigationController popViewControllerAnimated:YES]

}]

UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithCustomView:backBtn]

self.navigationItem.leftBarButtonItem = backItem

self.navigationController.interactivePopGestureRecognizer.enabled = YES//最重要的一步

方法二:在A页面里面(A页面里面的backBarButtonItem其实就是我们看到的B页面的返回按钮,B页面的leftBar是左侧的按钮,注意优先级,B里面有自定义leftBar,显示B页面的,如果没有,看A界面,如果里面有backBarButtonItem,显示,如果没有,就是系统默认的那个)

UIImage* image = [UIImage imageNamed:@"back"]

UIBarButtonItem *item = [[UIBarButtonItem alloc] init]

[item setBackButtonBackgroundImage:[image resizableImageWithCapInsets:UIEdgeInsetsMake(0, image.size.width, 0, 0)] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]

[item setBackButtonTitlePositionAdjustment:UIOffsetMake(-400.f, 0) forBarMetrics:UIBarMetricsDefault]

self.navigationItem.backBarButtonItem = item

self.navigationItem.backBarButtonItem = item

我采用的是方法一,方法二我没有办法调整返回按钮的位置


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11548618.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存