开发问题笔记(一)

目录

1.定义设备|屏幕宏
2.定义系统宏
3.初始化问题
4.按钮的与非状态设置
5.表格cell复用的相关问题
6.去掉按钮的“快速点击的bug”
7.过滤掉地址中省份的方法
8.富文本的使用
9.懒加载
10.iOS判断并使用百度地图、高德地图导航
11.iOS开发中让子视图不响应父视图的手势识别器
12.软件研发环境区别
13.因为“类型修饰错误”造成很难查找的天坑
14.注意内存缓存问题
15.时间的处理
16.问题场景:九宫格,hud问题
17.UITextField内容重叠
18.个人页面复用问题
19.Cell的封装
20.GitHub下载Demo
21.表格指定刷新
22.Apple Mach-O Linker Error错误
23.自定义View的步骤(3部曲)
24.循环引用的问题这样理解
25.宏定义(Define.h)
26.头文件(PrefixHeader.pch)
27.实现一个表格视图的动画(下拉旋转)
28.清除文件缓存的方法
29.网络检测
30.关于键盘知识

1.定义设备|屏幕宏

#define IPHONE4 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 960), [[UIScreen mainScreen] currentMode].size) : NO)

#define IPHONE5 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 1136), [[UIScreen mainScreen] currentMode].size) : NO)

#define IPHONE6 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(750, 1334), [[UIScreen mainScreen] currentMode].size) : NO)

#define IPHONE6PLUS ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1242, 2208), [[UIScreen mainScreen] currentMode].size) : NO)
开发问题笔记(一)_第1张图片
设备|屏幕宏

2.定义系统宏

#define ISIOS8 [[UIDevice currentDevice].systemVersion floatValue]>=8
系统宏

3.初始化问题(见例子)

在cell中没有加if(!….)来创建_tripOrderView;导致viewdidload时候创建一次;然后请求数据成功后reoloadData时候又创建一次,会出现问题
if (indexPath.section == 0) {
        
        if (!_tripOrderView) {
            _tripOrderView = [UToTripOrderView initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 120) IsSimple:NO];
            [cell.contentView addSubview:_tripOrderView];
}

在cell里面创建控件时要记得在没有的情况下才去创建,否则在每次表格刷新数据时他又重新创建,造成问题,比如按钮的状态每次都更新到了最初的默认状态,例如:(用非状态来创建)
if (!_arrowBtn) {
                
    _arrowBtn = [[UIButton alloc]init];
    [_arrowBtn setImage:[UIImage imageNamed:@"arrowDown"] forState:0];
    [_arrowBtn setImage:[UIImage imageNamed:@"arrowUp"] forState:UIControlStateSelected];
    [_arrowBtn addTarget:self action:@selector(arrowBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
}
    [specialRequestCell.rightView addSubview:_arrowBtn];

4.按钮的与非状态设置

1.按钮通过当前图片判断实现切换,比如求助,比如顺风车的开关
[_switchBtn addTarget:self action:@selector(switchBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
            [_switchBtn setImage:[UIImage imageNamed:@"home_bth_pre"] forState:UIControlStateNormal];
// 闪电接单按钮回调
- (void)switchBtnClicked:(UIButton *)sender {
    
    if ([sender.currentImage isEqual:[UIImage imageNamed:@"home_bth_pre"]]) {
        
        [sender setImage:[UIImage imageNamed:@"home_bth"] forState:0];
    } else {
        
        [sender setImage:[UIImage imageNamed:@"home_bth_pre"] forState:UIControlStateNormal];
    }
}

2.选中与不选中的与非操作:
cell.headImg.highlighted = !cell.headImg.highlighted;
sender.selected = !sender.selected;

5.表格cell复用的相关问题

  • cell的复用问题
tableViewCell的复用问题
(1).此方法创建不会有cell复用问题(当每个cell要弄得不一样最好用这种方法创建 )
UToSpecialRequestCell *specialRequestCell = [[UToSpecialRequestCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"CELL"];
(2).此方法创建会复用
UToSpecialRequestCell *specialRequestCell = [tableView dequeueReusableCellWithIdentifier:@"CELL"];
    
   if (!specialRequestCell) {
            
     specialRequestCell = [[UToSpecialRequestCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CELL"];
   }

表格复用问题
(1)UToSpecialRequestCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CELL"];
    if (!cell) {
        
        cell = [[UToSpecialRequestCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CELL"];
   }
(2)UToSpecialRequestCell *cell = [[UToSpecialRequestCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CELL"];
两中方法创建:(1)是复用;(2)不复用;用于cell各自自定义,如果自定义却用了第一中,在初始化第一次时应该不会报错,在刷新表格之后会报错,奔溃
命名如cell,和标识符@“CELL”最好其他的cell不一样,以免 引起问题 
  • cell的标识的使用
方法1)在创建表格时注册,然后显示方法中使用
创建表格:
[_tableView registerClass:[UToInvoiceListCell class] forCellReuseIdentifier:@"UToInvoiceListCell"];

cell 显示中:
- (UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath {
    
    UToInvoiceListCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UToInvoiceListCell"];
    return cell;
}

方法2)在封装的cell中写个标示;然后控制器直接在cell显示地方用有标示的创建方法
cell.h 文件
extern  NSString * const UToTrainTicketsCellIdentifier;

cell.m 文件
NSString * const UToTrainTicketsCellIdentifier = @"UToTrainTicketsCellIdentifier";

控制器中:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    UToTrainTicketsCell *cell = [[UToTrainTicketsCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:UToTrainTicketsCellIdentifier];
    
    if (!cell) {
        
        cell = [tableView dequeueReusableCellWithIdentifier:UToTrainTicketsCellIdentifier];
    }
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    
    UToTrainTicketsModel *model = _searchResultDataSource[indexPath.row];
    cell.ticketModel = model;
    return cell;
}
  • 误以为是cell复用的刷新坑

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:1] withRowAnimation:UITableViewRowAnimationNone];
这个局部刷新方法不能写在表格的代理方法中,会二次刷新(本身一进入视图的时候就会刷新的),之后只要有表格刷新,都会重复刷新,(滑动时)会出现cell错乱问题,还有可能因内存过大奔溃;如果是封装的cell中有按钮的block回调话,可以用,因为只是点击时才加载,而不是一直都加载

开发问题笔记(一)_第2张图片
屏幕快照 2018-03-16 下午2.35.52.png

6.去掉按钮的“快速点击的bug”

- (void)todoSomething:(id)sender {
    
    //在这里做按钮的想做的事情。
    [self loadIssueOrderData];
}

// 确定发布订单按钮回调
- (void)issueOrderButtonClicked:(UIButton *)sender {
    
    //先将未到时间执行前的任务取消。
    [[self class] cancelPreviousPerformRequestsWithTarget:self selector:@selector(todoSomething:) object:sender];
    [self performSelector:@selector(todoSomething:) withObject:sender afterDelay:0.18f];
}

7.过滤掉地址中省份的方法(掌握string的方法)

方法一:
positionCity.adress = @“四川省成都市武侯区成汉南路”;改后:成都市武侯区成汉南路
NSRange range = [result.address rangeOfString:@"省"];
            
            if (range.length) {
                
                range.length = range.location+range.length;
                range.location = 0;
                positionCity.adress = [result.address stringByReplacingCharactersInRange:range withString:@""];
            } else {
                
                positionCity.adress = result.address;
            }

            weakSelf.positionCity = positionCity;
            weakSelf.travelRouteView.startLabel.text = positionCity.adress;
            [weakSelf.travelRouteView.startLabel setTextColor:[UToColor blackColor]];
            weakSelf.travelRouteView.positionCity = positionCity;

方法二:
在doNotWant这个字符集里想写几个过滤的字符就写几个
NSCharacterSet *doNotWant = [NSCharacterSet characterSetWithCharactersInString:@"市"];
_orderDetail.srcCity = [[_orderDetail.srcCity componentsSeparatedByCharactersInSet: doNotWant]componentsJoinedByString: @""];
_orderDetail.destCity = [[_orderDetail.destCity componentsSeparatedByCharactersInSet: doNotWant]componentsJoinedByString: @""];
cell.subLabel.text = [NSString stringWithFormat:@"%@ ⇀ %@",_orderDetail.srcCity,_orderDetail.destCity];

总结:


开发问题笔记(一)_第3张图片
屏幕快照 2017-08-09 上午11.22.00.png

8.富文本的使用

NSString *text = [NSString stringWithFormat:@"¥%.2f/座 共%@座",[_priceText.text floatValue],_seatNum.text];
NSRange range = [text rangeOfString:[NSString stringWithFormat:@"%.2f",[_priceText.text floatValue]]];
NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc]initWithString:text];
    [attributeString setAttributes:@{NSForegroundColorAttributeName : [UToColor redColor],NSFontAttributeName : [UToFont subTitleFont]} range:range];
NSRange range2 = [text rangeOfString:[NSString stringWithFormat:@"/座 剩%@座",_seatNum.text]];
    [attributeString setAttributes:@{NSForegroundColorAttributeName : [UToColor blackColor],   NSFontAttributeName : [UToFont titleFont]} range:range2];
_orderSeatInfo.attributedText = attributeString;
NSString *text = [NSString stringWithFormat:@"费用:¥%.2f/座",[_orderDetail.seatPrice floatValue]];
                NSRange range = [text rangeOfString:[NSString stringWithFormat:@"%.2f",[_orderDetail.seatPrice floatValue]]];
                NSMutableAttributedString *attributedStr = [[NSMutableAttributedString alloc]initWithString:text];
                [attributedStr setAttributes:@{NSForegroundColorAttributeName : [UToColor redColor]} range:range];
                NSRange range2 = [text rangeOfString:[NSString stringWithFormat:@"座"]];
                [attributedStr setAttributes:@{NSForegroundColorAttributeName : [UToColor blackColor],NSFontAttributeName : [UIFont systemFontOfSize:11]} range:range2];
                _tripOrderView.priceLabel.attributedText = attributedStr;
 NSString *text = [NSString stringWithFormat:@"¥%.1f/座",_journey.seatPrice];
        NSRange range = [text rangeOfString:[NSString stringWithFormat:@"%.1f",_journey.seatPrice]];
        NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:text];
        [attributeString setAttributes:@{NSForegroundColorAttributeName : [UIColor redColor],   NSFontAttributeName : [UToFont maxTitleFont]} range:range];
        cell.rightLabel.attributedText = attributeString;
  • 复杂的例子1如图:
发票
开发问题笔记(一)_第4张图片
屏幕快照 2018-03-19 下午2.12.08.png
开发问题笔记(一)_第5张图片
屏幕快照 2018-03-19 下午2.12.21.png
  • 复杂的例子2如图:


    屏幕快照 2018-03-19 下午2.35.14.png

    开发问题笔记(一)_第6张图片
    屏幕快照 2018-03-19 下午2.36.04.png
  • 富文本给文字添加下划线

image.png
开发问题笔记(一)_第7张图片
image.png

9.懒加载

懒加载方法使用:创建初始化的时候用下划线,任何地方调用的时候用self点语法;self. 语法调用了set与get方法;懒加载只有初始化作用,当调用了self. 语法后相当于懒加载也重写了set方法

项目中遇到过问题:因为懒加载的使用而造成初始化失败,为空。如,顺风车特别要求那个数据要用到默认值(不选的话),这时候需要在初始化地方写默认值,因为用了懒加载,没有走那,没有初始化成功(对懒加载理解不深,以后少用,直接在didLoad里面初始化),造成默认值为空,提交数据为空则报错奔溃。

开发问题笔记(一)_第8张图片
小结

例子:

开发问题笔记(一)_第9张图片
屏幕快照 2017-11-10 上午10.59.31.png

屏幕快照 2017-11-10 上午11.00.23.png
屏幕快照 2017-11-10 上午11.00.34.png

懒加载创建表格视图例1:

开发问题笔记(一)_第10张图片
屏幕快照 2017-03-06 上午10.40.15.png

懒加载创建表格视图例2:

开发问题笔记(一)_第11张图片
屏幕快照 2017-11-30 下午6.42.43.png

开发问题笔记(一)_第12张图片
屏幕快照 2017-11-30 下午6.43.27.png

相关链接:https://www.cnblogs.com/mancong/p/5051698.html

10. iOS 判断并使用 百度地图 高德地图 导航(使用URI,不集成sdk)

BOOL hasBaiduMap = NO;  
BOOL hasGaodeMap = NO;  

 if ([[UIApplication sharedApplication]canOpenURL:[NSURL URLWithString:@"baidumap://map/"]]) {  

         hasBaiduMap = YES;  
  }  
 if ([[UIApplication sharedApplication]canOpenURL:[NSURL URLWithString:@"iosamap://"]]) {  

         hasGaodeMap = YES;  
 }  

  if ([@"使用百度地图导航" isEqualToString:title])   {  
               
     NSString *urlString = [[NSString stringWithFormat:@"baidumap://map/direction?origin=latlng:%f,%f|name:我的位置&destination=latlng:%f,%f|name:终点&mode=driving",currentLat, currentLon,_shopLat,_shopLon] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] ;  
     [[UIApplication sharedApplication]openURL:[NSURL URLWithString:urlString]];  
  } else if ([@"使用高德地图导航" isEqualToString:title])  {   

       以专车司机端为例
       NSString *urlString = [[NSString stringWithFormat:@"iosamap://navi?sourceApplication=%@&backScheme=%@&poiname=%@&lat=%f&lon=%f&dev=1&style=2",@"UtoDriver", @"iosamap", _driverJourney.dstName, _driverJourney.latitude,_driverJourney.longtitude] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
       [[UIApplication sharedApplication]openURL:[NSURL URLWithString:urlString]]; 
  }  
注意事项:例如用高德地图时要在plist文件中添加一个属性:iosamap

http://www.cocoachina.com/ios/20150817/13021.html
高德地图开发平台(如路线规划):http://lbs.amap.com/api/ios-navi-sdk/guide/route-plan/drive-route-plan

打开自带的苹果原生地图:
其中coordinate是当前的经纬度坐标,tolocation.name是目的地名字

开发问题笔记(一)_第13张图片
屏幕快照 2017-11-16 下午9.35.14.png

开发问题笔记(一)_第14张图片
屏幕快照 2017-11-16 下午9.35.27.png

iOS调用地图(含各种坐标之间转换)相关链接:https://www.jianshu.com/p/ada613ed5549
iOS坐标转换:https://www.jianshu.com/p/fbf25d379959

11.iOS开发中让子视图不响应父视图的手势识别器

问题描述:

给父视图上添加一个子视图,给父视图添加一个手势识别器UITapGestureRecognizer,点击子视图时,也会触发UITapGestureRecognizer所关联的事件

解决方法:

使用UIGestureRecognizerDelegate的代理方法-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch,将子视图的tap手势屏蔽

 -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {  
      
        if ([touch.view isDescendantOfView:self.listV]) {  

            return NO;  
        }  
        return YES; 
    }  

12.软件研发环境区别

开发环境:开发环境时程序猿们专门用于开发的服务器,配置可以比较随意,为了开发调试方便,一般打开全部错误报告和测试工具,是最基础的环境。开发环境的分支,一般是feature分支。

测试环境:一般是克隆一份生产环境的配置,一个程序在测试环境工作不正常,那么肯定不能把它发布到生产服务器上,是开发环境到生产环境的过度环境。测试环境的分支一般是develop分支,部署到公司私有的服务器或者局域网服务器上,主要用于测试是否存在bug,一般会不让用户和其他人看到,并且测试环境会尽量与生产环境相似。

生产环境: 生产环境是指正式提供对外服务的,一般会关掉错误报告,打开错误日志,是最重要的环境。部署分支一般为master分支。

开发问题笔记(一)_第15张图片
屏幕快照 2017-05-22 下午6.21.56.png

总计:三个环境也可以说是系统开发的三个阶段:开发->测试->上线,其中生产环境也就是通产说的真实的环境,最后交给用户的环境。

13.因为“类型修饰错误”造成很难查找的天坑

比如:NSIndex不能assign来修饰,在iphone5及系统在10.0以下会有问题。注意要用strong!!!
同样问题:在消息中心封装的segementView中颜色是对象类型用strong,而不是用assign;造成了内存泄漏(不一定在什么时候就会发生,导致奔溃)!导致问题:测试环境不会有问题,不奔溃,线上环境程序奔溃。
带*号的都是对象,注意具体有些用copy...什么的

正确修饰:@property (nonatomic, strong) NSIndexPath *currIndexPath;
用assign导致奔溃如下图:


开发问题笔记(一)_第16张图片
屏幕快照 2017-07-20 下午6.10.11.png

14.注意内存缓存问题

比如切换工程分枝的时候出现问题:分享APP时,微信朋友圈文字未显示完整,就是因为缓存问题;解决:clean一下工程即可!

开发问题笔记(一)_第17张图片
屏幕快照 2017-08-31 下午3.23.38.png

15.时间的处理

系统返回的是时间戳:NSTimeInterval(typedef double NSTimeInterval;double类型)
NSTimeInterval:(后面有很多0 )

类型一:APP用NSString来接收
@property (nonatomic, copy) NSString *departure;// 出发时间
_timeLabel.text = [NSDate dateString9WithDate:[NSDate dateWithTimeIntervalSince1970:[_campusBusTicketModel.departure longLongValue]/1000]];

类型二:用UInt64
@property (nonatomic, assign) UInt64 departure; //  去程发车时间
cell.titleLabel.text = [NSDate dateString9WithDate:[NSDate dateWithTimeIntervalSince1970:_trainFillOrder.departure/1000]];

时间设置年月日:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
//设定时间格式,这里可以设置成自己需要的格式
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
//用[NSDate date]可以获取系统当前时间
NSString *currentDateStr = [dateFormatter stringFromDate:[NSDate date]];

NSDate 转UInt64方法:
UInt64 leaveTime = [self.reservationInfo.leaveTime timeIntervalSince1970];

UInt64转NSString:
NSString *temTimeStr = [NSDate dateString7WithDate:[NSDate dateWithTimeIntervalSince1970:tmSpots.departure/1000]];

NSString转UInt64:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm"];
int64_t i = atoll([_backSrcSpots.departure UTF8String]);
NSString *currentDateStr = [dateFormatter stringFromDate:[NSDate dateWithTimeIntervalSince1970:i/1000]];
cell.timeLB.text = [NSString stringWithFormat:@"%@ 返回",currentDateStr];

获取当前时间:
NSDate * senddate=[NSDate date];
NSDateFormatter *dateformatter=[[NSDateFormatter alloc] init];
[dateformatter setDateFormat:@"yyyyMMddHHmm"];
其中格式可以自定义设置,如可换成:@"yyyy-MM-dd"
NSString * timeStamps=[dateformatter stringFromDate:senddate];
return timeStamps;

备注例子:

开发问题笔记(一)_第18张图片
屏幕快照 2017-12-19 上午11.45.15.png

后天返的时间戳:1513701600000,去掉最后3位0转换结果如下
屏幕快照 2017-12-19 上午11.42.30.png

直通车:

屏幕快照 2017-12-23 下午3.55.29.png
屏幕快照 2017-12-19 上午11.42.52.png

票务:

屏幕快照 2017-12-23 下午3.54.52.png
屏幕快照 2017-12-23 下午3.50.10.png

其中封装的方法:

开发问题笔记(一)_第19张图片
屏幕快照 2017-12-23 下午3.52.08.png

联系人:

屏幕快照 2017-12-19 上午11.43.32.png
开发问题笔记(一)_第20张图片
屏幕快照 2017-12-19 上午11.43.54.png

iOS获取当前时间、一周前时间、比较时间大小、时间戳转换:https://www.jianshu.com/p/23f9c6a0e8f2
时间转换:https://www.jianshu.com/p/43d2b343d7f4
当前时间比较:https://blog.csdn.net/onetagtag/article/details/52243077

补充1:预约到店时间显示:

开发问题笔记(一)_第21张图片
EE9AFFF6C3D75E48CF0CD46E82336290.jpg

补充例子2(点金树;有些后台返回的全,多3位,就除以1000即可):

图片.png

图片.png
开发问题笔记(一)_第22张图片
图片.png
图片.png

补充3:

开发问题笔记(一)_第23张图片
屏幕快照 2018-11-09 下午9.47.57.png

开发问题笔记(一)_第24张图片
image.png

补充4:

选择时间以后会在上方显示,这个是字符串,然后根据选择的时间进行数据刷新。现在需要把这个时间以时间戳的方式传给后台(接口时间定义int,但是我以字符串传给他,也能处理;最好以int形式传给后台,参照补充5)

接口时间定义
开发问题笔记(一)_第25张图片
效果图
开发问题笔记(一)_第26张图片
核心的代码

备注:上面*1000表示时间戳精确到毫秒,不乘就是精确到秒;看后台那边处理再具体选择

开发问题笔记(一)_第27张图片
相关补充说明

补充5:

前面页面跳转过来带一个时间(时间是字符串),然后把这个时间以时间戳的方式传给后台(接口时间是int型)

接口时间定义
开发问题笔记(一)_第28张图片
效果图
开发问题笔记(一)_第29张图片
核心的代码

补充6:

问题场景:服务器传回来的是时间戳字符串:@"1698668680",也是用字符串接收@property (nonatomic, copy) NSString *curtime;// 时间戳;现在需要展示成@"2019-01-28"这种字符串。正确做法如图一;错误做法如图二

开发问题笔记(一)_第30张图片
图一
开发问题笔记(一)_第31张图片
图二

补充说明:dateFromString这个方法后面跟的字符串必须是:@"2019-01-28"这种格式的字符串;不能是时间戳字符串格式:@"1698668680",这样会取不到值,比如下面图二做法就是错误的,date1是nil空值

16.问题场景

九宫格:扫码拼车时,选择乘车联系人时多次后,程序奔溃!打全局断点,也不走。这时可以通过

开发问题笔记(一)_第32张图片
屏幕快照 2017-08-31 下午3.28.51.png

这个来查找之前奔溃所记录的;从中看出:Terminated due to memory issue 是内存的原因;然后一边操作一边查看内存的增长情况,测试可以看到内存一直暴涨,没有减;查看代码是因为每次更换人数的时候都要请求价格数据,而请求价格数据时肯定都要转菊花,这时内存就疯涨,而没有释放的原因就是菊花相关的hud没有设置代理,导致每次加载数据转菊花时没有释放内存!!!加上代理即可,要注意此类问题的解决办法:重点是精确定位到“问题的原因,解决过程和方法”

开发问题笔记(一)_第33张图片
屏幕快照 2017-08-03 下午6.04.02.png
开发问题笔记(一)_第34张图片
屏幕快照 2017-08-03 下午6.04.55.png

17.UITextField

忘记密码地方使用方法:
封装写了一个cell,里面含有textField,但是外面想让他变成全局的,于是就在外面写了一个全局的textfield然后加到cell里面的textfield;这样造成了响应的时候会有两次键盘,然后字体会一直重叠…下次需要注意

开发问题笔记(一)_第35张图片
屏幕快照 2017-07-12 下午7.57.16.png

18.复用问题

个人信息页面更改昵称那个地方,因为cell用tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath 创建,复用问题导致加的_nameTextfiled不断重叠,需要注意

开发问题笔记(一)_第36张图片
屏幕快照 2017-07-13 下午4.43.41.png

19.Cell的封装

初始化是这个方法不是view的初始化(不是alloc,init),要注意,很容易忘记:

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    
    self = [super initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:reuseIdentifier];
    
    if (self) {
        
        self.backgroundColor = [UToColor backWhiteColor];
        [self creatUI];
    }
    return self;
}

20.GitHub下载Demo

从邮箱或者GitHub上下载的demo,如果它的上一级文件是中文名则可能报错(/Users/timefly/Library/Developer/Xcode/DerivedData/EXOCR-fkanigacrinffjgrphf:no such
file……)

21.表格指定刷新

//一个section刷新    
NSIndexSet *indexSet=[[NSIndexSet alloc]initWithIndex:2];    
[tableview reloadSections:indexSet withRowAnimation:UITableViewRowAnimationAutomatic];    

//一个cell刷新    
NSIndexPath *indexPath=[NSIndexPath indexPathForRow:3 inSection:0];    
[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath,nil] withRowAnimation:UITableViewRowAnimationNone]; 

22. Apple Mach-O Linker Error错误

开发问题笔记(一)_第37张图片
屏幕快照 2017-08-28 下午2.09.26.png

23.自定义View的步骤(3部曲)

• 1.重写初始化方法 (在里面进行一次性的初始化)
xib :awakeFromNib
纯代码:initWithFrame
• 2.重写layoutSubviews, 在里面布局子控件
• 3.接收外界传入的数据, 重写set方法

24.循环引用的问题这样理解:

比如在main函数中创建了两个类的对象A和B,现在引用计数都是1。现在让A和B互相引用(A有一个属性是B对象,属性说明是retain;B有一个属性是A对象,属性说明是retain),现在两个对象的引用计数都增加了1,都变成了2。现在执行[A release]; [B release]; 此时创建对象的main函数已经释放了自己对对象的所有权,但是此时A和B的引用计数都还是1,因为他们互相引用了。这时你发现A和B将无法释放,因为要想释放A必须先释放B,在B的dealloc方法中再释放A。同理,要想释放B必须先释放A,在A的dealloc方法中再释放B。所以这两个对象将一直存在在内存中而不释放。这就是所谓的循环引用的问题。要想解决这个问题,一般的方法可以将引用的属性设置为assign,而不是retain来处理

25.宏定义(Define.h)

在这个文件里所定义的宏到处可用

开发问题笔记(一)_第38张图片
屏幕快照 2016-01-23 下午5.07.50.png
开发问题笔记(一)_第39张图片
屏幕快照 2017-09-22 下午2.42.38.png

定义屏幕大小(3种写法)
1.self.view.bounds-->满屏
2.define WIDTH self.view.bounds.size.width
define HEIGHT self.view.bounds.size.height
3.define kScreenSize [UIScreen mainScreen].bounds.size
(d前面这里都少写了个#号)

26.头文件(PrefixHeader.pch)

放在这里的头文件到处可用;需要简单配置一哈

需要在项目-->目标-->Build Settings修改Prefix Header的,将其前面那些地址改成 (SRCROOT)/OSClient/PrefixHeader.pch
其中OSClient是项目名字(此是开源中国那个项目的);(SRCROOT)/项目名字/pch文件取的名字(有后缀)

开发问题笔记(一)_第40张图片
屏幕快照 2016-01-23 下午5.08.23.png
开发问题笔记(一)_第41张图片
屏幕快照 2017-09-22 下午2.42.47.png
开发问题笔记(一)_第42张图片
屏幕快照 2017-09-22 下午2.43.14.png

27.实现一个表格视图的动画(下拉旋转)

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
    //转动特效
    CATransform3D rotation;
    rotation = CATransform3DMakeRotation( (90.0*M_PI)/180, 0.0, 0.7, 0.4);
    rotation.m34 = 1.0/ -600;
    
    cell.layer.shadowColor = [[UIColor blackColor]CGColor];
    cell.layer.shadowOffset = CGSizeMake(10, 10);
    cell.alpha = 0;
    cell.layer.transform = rotation;
    //cell.layer.anchorPoint = CGPointMake(0, 0.5);
    [UIView beginAnimations:@"rotation" context:NULL];
    [UIView setAnimationDuration:0.8];
    cell.layer.transform = CATransform3DIdentity;
    cell.alpha = 0.7;
    cell.layer.shadowOffset = CGSizeMake(0, 0);
    [UIView commitAnimations];

    [UIView animateWithDuration:0.5 animations:^{

        cell.layer.transform = CATransform3DIdentity;
        cell.alpha = 1;
        cell.layer.shadowOffset = CGSizeMake(0, 0);
    }];
}

28.清除文件缓存的方法

封装清除文件的类:

开发问题笔记(一)_第43张图片
屏幕快照 2017-03-10 下午3.29.50.png

开发问题笔记(一)_第44张图片
屏幕快照 2017-03-10 下午3.30.21.png

调用:

开发问题笔记(一)_第45张图片
屏幕快照 2017-03-10 下午3.33.11.png

另外一种方法清除缓存:

dispatch_async(
                       dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
                       , ^{
                           NSString *cachPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask, YES) objectAtIndex:0];
                           
                           NSArray *files = [[NSFileManager defaultManager] subpathsAtPath:cachPath];
                           
                           for (NSString *p in files) {
                               NSError *error;
                               NSString *path = [cachPath stringByAppendingPathComponent:p];
                               if ([[NSFileManager defaultManager] fileExistsAtPath:path]) {
                                   BOOL isSuccess = [[NSFileManager defaultManager] removeItemAtPath:path error:&error];
                                   if (isSuccess) {
                                       [SVProgressHUD showInfoWithStatus:@"清除缓存成功"];
                                       
                                   }
                               }
                           }
                       });

29.网络检测

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
 //网络检测
    [self monitoerNetworking];

// 显示网络活动指示器
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
    
// 显示应用程序图标徽章
    [UIApplication sharedApplication].applicationIconBadgeNumber = 8;

     return YES;
}

//检测网络状况
-(void)monitoerNetworking{
    AFNetworkReachabilityManager *manager=[AFNetworkReachabilityManager sharedManager];
    //设置网络变更回调
    [manager setReachabilityStatusChangeBlock:^ void(AFNetworkReachabilityStatus status) {
        NSString *str=nil;
        switch (status) {
            case AFNetworkReachabilityStatusReachableViaWiFi:
                str=@"Wifi";
                break;
            case AFNetworkReachabilityStatusReachableViaWWAN:
                str=@"蜂窝";
            case AFNetworkReachabilityStatusNotReachable:
                str=@"无法连接";
            case AFNetworkReachabilityStatusUnknown:
                str=@"未知";
                break;
            default:
                break;
        }
        
        MBProgressHUDManager *mar=[[MBProgressHUDManager alloc]initWithView:self.window];
        [mar showNoticeMessage:[NSString stringWithFormat:@"当前使用网络:%@",str] duration:1 complection:^{
            
        }];
        
    }];
    //开启检测网络
    [manager startMonitoring];    
}

30.关于键盘知识

常用键盘类型:https://blog.csdn.net/qq_36478920/article/details/78316788

开发问题笔记(一)_第46张图片
678612-36bd223bc484ed0c.png
开发问题笔记(一)_第47张图片
678612-4bc8e8eb35693de6.png

你可能感兴趣的:(开发问题笔记(一))