0702
1.利用strong和copy的属性特性来做缓存(memery save), 才理解了strong和copy真正的用途.
A页面push到B页面,返回A,再次进入B时,B会因为alloc而init了所有数据,
那有什么办法缓存B的数据呢?
--只要在B控制器的.h中,设立一个strong特质的属性,来作为A与B的桥梁.
如此一来,B页面的model值发生任何改变,A页面的model会因strong特性而做相同改变.
但是,这样还不够!比如B页面pop到A页面后销毁以后,
B的model数据可能会丢失而连带A的model数据丢失.
所以,这时copy就派上用场了.
只需把model的对象类型属性特质为copy, 基本数据类型为assign即可.
当再次进入B时,页面可根据model一一手动设置旧数据,此时model数据是完好的.
0703
使用single单例做全局保存, 对于一些get的接口,每次运行app只需load一次,可以缓存到单例的数组里,便于项目获取直接使用,连sqlite保存都省了.
0704
尝试了”方法block”, 十分好用神奇(之前一直使用属性block,两者还是有区别的)
//需求:
//A需要调用B的方法, 当B处理完事务后, 把结果返回给A.
//A代码
[self sgsLivenessTest:^(id data) {
//获得结果data
}];
//B的方法(block类型在B的h文件声明即可)
-(void)sgsLivenessTest:(SGSIDLFaceToolBlock)sgsBlock{
//do something...{
//回调
sgsBlock(imaStr64);
}
//other code...
}
0705
从后台获得model后,有时需要对数据进行转化,比如
字段PAYWAY( 1:一次性付款;2:商业贷款;3:公积金贷款)
//思路:后台返回的是数字,自己新定义一个字段PAYWAY_TEXT,作为对应的中文
//数据处理放在model层
- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic{
//付款方式文字
NSString *payway = dic[@"PAYWAY"];
if (!kStringIsEmpty(payway)) {
if ([payway isEqualToString:@"1"]) {
self.PAYWAY_TEXT = @"一次性付款";
} else if ([payway isEqualToString:@"2"]) {
self.PAYWAY_TEXT = @"商业贷款";
} else if ([payway isEqualToString:@"3"]) {
self.PAYWAY_TEXT = @"公积金贷款";
} else{
self.PAYWAY_TEXT = @"";
}
}
return YES;
}
0706
处理了tableview”上拉加载”时, 重复请求同一个page的问题, 也搞定了”上拉加载”时,底部该显示”无更多数据”还是”加载更多”的问题
//说说我的核心思路:
//1.1第一次请求,tableIndex=1去request,tableview底部是个loading标志.
//1.2响应后,需要后台返回当前data的pageIndex和总页数pageSum,这两个数据后台是可以拿到的.
//2.1判断请求的tableIndex和后台给你的pageIndex是否一致
if (self.currentPageIndex != index) {
//如果我请求的cx不等于后台返回的index,说明重复请求了.
return;
}
//2.2到这里,说明不存在重复请求,把后台的data放入self.tableDatas后,
self.currentPageIndex = index+1;//这是唯一使tableIndex+1的地方
//3.自己判断,if(后台的pageIndex<pageSum),则用户再次下拉时显示"加载更多"的标志,继续请求...
//反之,如果pageIndex==pageSum,则"无更多数据",不用再请求.
//部分源码:
#pragma mark - request的回调
-(void)sgsOldHouseHandleResult:(BOOL)isSuccess isMore:(BOOL)isMorePage list:(NSArray<SGSHouseListModel *> *)listData serverPage:(NSInteger)index{
[self endAllRefresh:self.sgsIGCollectView];
if (isSuccess==NO) {
return;
}
if (self.currentPageIndex != index) {
//如果我请求的cx不等于后台返回的index,说明重复请求了.
return;
}
if (self.currentPageIndex == 1) {
self.listDatas = [NSMutableArray array];
}
self.currentPageIndex = index+1;//以后台返回当前index为准
[self.listDatas addObjectsFromArray:listData];
self.isHaveMorePage = isMorePage;
[self.sgsIGAdapter reloadDataWithCompletion:nil];//刷新
}
再说说tableview”下拉加载”的category, 解耦合:
#import <UIKit/UIKit.h>
@interface UIViewController (SGSUIRefresh)
#pragma mark - MJRefresh
- (void)setFooterRefresh:(UIScrollView *)scrollView;
- (void)endFooterRefresh:(UIScrollView *)scrollView;
#pragma mark - MJ伪回调,实现类自己添加"request"即可.
- (void)footerRefreshing;
@end
#import "UIViewController+SGSUIRefresh.h"
#import <MJRefresh.h>
@implementation UIViewController (SGSUIRefresh)
- (void)setFooterRefresh:(UIScrollView *)scrollView {
if (scrollView.mj_footer == nil) {
scrollView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(footerRefreshing)];
}
}
- (void)endFooterRefresh:(UIScrollView *)scrollView
{
[scrollView.mj_footer endRefreshing];
}
- (void)footerRefreshing {
//实现类在这里request...
}
category写好了, 该如何使用?
//viewDidLoad里面添加footer
[self setFooterRefresh:self.tableView];
//实现自己的request
-(void)footerRefreshing{
[self loadRemoteData];
}
0707
记ios的present Controller的一个小问题, 比如A–>B(present):
//在B的.h里面,设置一个属性testName
//当在A里面写:
B *b = [[B alloc]init];
b.testName = @"hhh";
[self presentViewController:b animated:NO completion:nil];
//你会发现在b的viewDidLoad里面,testName是nil.
//解决方法:在viewWillAppear里面,才可以获取到testName.
//打断点发现代码顺序:
①b的init
②b的viewDidLoad
③b.testName = @"hhh";//才赋值
④b的viewWillAppear
简直就呵呵了.
0708
关于textField如何准确及时获取text ?
先说需求, 就是普通的登录页面.
正确结论:点击
//1.此代理方法,是在'把新字符赋予textField'之前就执行的,
//所以,此方法的textField.text是旧值,text是不准确的!!
-(BOOL)textField:(UITextField *)textField
shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string;
//2.此代理方法,是在光标消失后(退出编辑后),才执行
//如果用户没把键盘收回去,就点击登录按钮.
//此代理的textField.text也是不准确
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField;
//所以,我觉得ios的UITextFieldDelegate非常没用!!
我的方法,
使用UITextFieldTextDidChangeNotification+全局变量textField.text
这样,无论什么变化,都可以及时获得正确的text
//初始化时
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(setMyValueForTextField)
name:UITextFieldTextDidChangeNotification object:nil];
//销毁时
[[NSNotificationCenter defaultCenter] removeObserver:self
name:UITextFieldTextDidChangeNotification object:nil];
//获取text
-(void)setMyValueForTextField{
model.commonBuyer.QLRMC = [self.nameField.text
stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}