日常开发碰到问题总结

461 阅读9分钟

连调framework时,发现代码修改后运行,新的代码没生效?

解决办法:搜索了一下发现这个framework导入重复了

条件筛选列表,切换条件后重新请求数据,会crash

当前list展示的还是旧的数据,在新的请求数据到之前,删除旧数据的导致的,因为立刻删掉,会crash。

一个list弹框,点击空白区域隐藏,点击list的cell发现,didsel

UITableViewHeaderFooterView背景色设置

1.ping相关命令。

2.文件找不到 3.framwork中有anf,项目中也有afn,会不会冲突 两个framwork共同依赖一个工具类,怎么办,抽离一个公共库,然后让他俩都依赖?这样不就重复了吗

4.pod 安装,pod原理是啥 5.framwork 中的图片 6.多语言 7.证书文件 8.导航栏隐藏,展示,还有滑动手势 9.页面布局 10.项目中网络请求的代码阅读 11.framewok封装的优劣评判标准。 12.navitation, 隐藏展示的切换, 13.打印项目的网络请求json 14.策划手势,俩个界面导航栏都隐藏,就没有策划手势。 www.jianshu.com/p/7bec9ea95…

  1. framework 里的const string 不能给外部用吗?必须用宏? 16.WKWebView 登录后ajax自动带上cookie 你了解不了解

17.bitcode
18. B在A上居中放置,这样写:b.center = a.center,对吗? 不对,因为看截图中center的含义,center指的是frame的中间位置,b的center的x值是(b.x+b.width/2),所以上边的写法是错的。

如何实现分页加载

19.分页加载的问题,服务端给的支持如下:

所以加载逻辑应该是这样的:头部刷新的话,就把数据清空,startIndex = 1,一次加载20条,加载展示,底部刷新的话,就在之前startindex的基础上,再请求20条。这个逻辑不会有什么bug,但是有一个问题:假如我加载了很多条数据,头部刷新一次就清空了,这点可能不太好,但是这个应该是服务端的问题,他给的接口这么做,网易新闻等app,分页加载也是这样做的,可以这样试一下:加载两三页数据,然后在头部刷新一次,把网断了,加载下一页,发现加载不出来。

判断一个日期是今天,昨天,明天 www.jianshu.com/p/87f0d3c97…

判断网络是否可用 必须start一下,要不然拿的不对 [AFNetworkReachabilityManager managerForDomain:@"www.baidu.com"]; [self.manager startMonitoring];

碰到一个问题:传日一个时间戳,发现得到的字符串不对,最后查了资料才发现,这个@"HH:mm"大小写不同,含义也不同,还有就是要设置时区为当地时区。

获取一个日期的当天零点的时间。
   NSCalendar *calendar = [NSCalendar currentCalendar];
   NSDateComponents *components = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:self.selectedDate];
   [components setTimeZone:[NSTimeZone localTimeZone]];//少了这行代码返回的是0时区的时间,比如我传入的是当前时间4/9 9:30 +8时区,然后没有这行代码,得到的结果是4/8 15:00
   0时区,换算成东8区时间不对,可能是夏令时的问题,不过夏令时应该系统都做了,不需要我们特殊处理,设置时区后就正常了。
   NSDate *zeroDate = [calendar dateFromComponents:components];

NSInternalInconsistencyException', reason: 'Completion handler passed to

webview的scrolview滚动会和h5的冲突,需要禁掉

masonry不能立即拿到frame

www.jianshu.com/p/e71bcc7a5…

NSdate如何显示12个小时制,并显示am,pm?

hh代表12小时制,HH代表24小时制,加上aa会显示上下午。 [dateFormatter setDateFormat:@"HH:mm"],如果手机系统是12个小时,可以设置@"HH",来强制展示24小时时间,但是如果手机是12小时,无法强制展示24小时时间

封装的framework里引用Afnetworking,和其他的framework怎么办?

查看这里

关于时间的多语言问题,项目要支持韩语和英语,然后时间格式是不一样的,我本来想的是 [dateFormatter setDateFormat:LocalizedString:(@"datestring",nil)]; debug后如下图,发现英语环境根本得不到正确的时间格式。

- (NSString*)timeStringFromTimeInterval:(NSInteger)timeInterval{
    NSDate *detailDate = [NSDate date];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"MM dd, yyyy.You can change the setting of consent to reception in \"My information\"\"Reception setting.\""];
    [dateFormatter setTimeZone:[NSTimeZone localTimeZone]];
    return [dateFormatter stringFromDate:detailDate]
   

原来这样是不行的。formate里不应该包含太多英文。改成这样:

[NSString stringWithFormat:@"%@.You can change the setting of consent to reception in \"My information\"\"Reception setting.\"",timeString;

项目中以前用的是个推,需要替换成firebase的推送,然后我在podfile里把个推删掉,加了firebase,然后更新,发现报了这样的错。 提示个推sdk找不到,然后我想了下,应该是引用没删除的原因,然后找到了这里 把个推sdk的相关引用都删除了,编译后正常了。

问题:实现一个有圆角的按钮,并且需要根据文字内容自适应?

开始想的是自动布局,但是需要设置圆角,自动布局是没有办法获取到frame的,而且控件一般要求有个内边距,所以想的是boundrect函数,用frame设置按钮的大小,然后用自动布局的代码里设置按钮的位置,发现这样不行,文字并没有自适应,最后都用frame才实现。

问题:iOS10之后,关闭手机推送,然后在前台还能收到推送消息,只是不会有系统提醒

答案:很多做推送的厂商,例如GeTuSDK、他们在前台的时候会和客户端建立一个长连接,通过长链接推送,进入后台或者是app未启动,用的是apns,google的firebase之前也是这样,前台消息是透传的,最近他们移除了这个长链接,因为apns在前台的时候,即使用户关闭了推送,客户端依然会收到消息回调,只是没有推送提示框而已。

问题:最近有个需求,app后台收到推送时,点击推送需要打开指定的页面。

答案:在后台分为两种情况,app启动后然后退到后台,这时应用是启动过的,所以直接跳转是没有问题的,如果应用没有启动,我开始想的是,把消息存储起来,然后等app启动完成,在首页执行页面跳转,执行完把消息清掉。后来用consle调试发现userdfalult存储数据后,真机的包里一直没有,又建了个单例来存也是一样的效果,然后添加打印也没有执行,app未启动时点击推送是不会走这个方法的,然后百度了一下发现,这时的推送消息应该在didfinishlaunching里来获取,然后存储起来。 NSDictionary* userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; 果然终于可以了。可以参考这个 参考:链接

问题:想在scrollview停止滚动的时候做一些操作?需要调用哪些回调

` 答案: 有以下两种情况:

  • 没有惯性:只会调用停止拖拽的方法,不会调用停止减速的方法

  • 有惯性:既会调用停止拖拽的方法,也会调用停止减速的方法

所以:以后要判断UIScrollView是否停止滚动,需要同时重写两个方法:

  • scrollViewDidEndDragging

  • scrollViewDidEndDecelerating


// 在开发中如果需要监听scrollView滚动是否停止可以这样写

- (void)scrollViewDidEndDragging:(nonnull UISrollView *)scrollView willDecelerate:(BOOL)decelerate

{

if(decelerate == NO){

[self scrollViewDidEndDecelerating:scrolView];

}else{

}

}

- (void)scrollViewDidEndDecelerating:(nonnull UIScrollView *)scrollView

{

// 在这里面写scrollView停止时需要做的事情

NSLog(@"UIScrollView停止滚动了");

}

像素和分辨率

像素即px,是画面中最小的点(单位色块)。

分辨率=画面水平方向的像素值 * 画面垂直方向的像素值。分辨率可以分为两方面:屏幕分辨率和图像分辨率。

  1. 屏幕分辨率: 例如,屏幕分辨率是1024×768,也就是说设备屏幕的水平方向上有1024个像素点,垂直方向上有768个像素点。像素的大小是没有固定长度的,不同设备上一个单位像素色块的大小是不一样的。 例如,尺寸面积大小相同的两块屏幕,分辨率大小可以是不一样的,分辨率高的屏幕上面像素点(色块)就多,所以屏幕内可以展示的画面就更细致,单个色块面积更小。而分辨率低的屏幕上像素点(色块)更少,单个像素面积更大,可以显示的画面就没那么细致。
  2. 像素:每张图片都是由色点组成的,每个色点称为一个像素。一张图片由30万个色点组成,这个图片的像素就是30W。我们常说相机是多少像素,这个像素就是说这款照相机的感器件有多少个,有100W个感光器件的相机就是100W像素的相机,有4000W个感光器件的相机就是4000W像素,以此类推。一台100W像素的相机拍摄的照片洗成5寸的照片会比洗成6寸清晰一点。
  3. 图像分辨率:图像分辨率是指每英寸图像内的像素点数。图像分辨率是有单位的,叫 像素每英寸。分辨率越高,像素的点密度越高,图像越逼真(这就是为什么做大幅的喷绘时,要求图片分辨率要高,就是为了保证每英寸的画面上拥有更多的像素点)。
  4. 屏幕分辨率:屏幕分辨率是屏幕每行的像素点数*每列的像素点数,每个屏幕有自己的分辨率。屏幕分辨率越高,所呈现的色彩越多,清晰度越高。
  5. 图片如何压缩上传
- (NSData *)compressedImageDataWithOriginData:(NSData *)originData {
    UIImage *originImage = [UIImage imageWithData:originData];
    CGSize originSize = originImage.size;
    UIImage *compressedImage = originImage;
    CGFloat hFactor = originSize.width / kMaxImageSize.width;
    CGFloat vFactor = originSize.height / kMaxImageSize.height;
    // 确保图片的宽高不超过 (1080, 3199)
    //裁剪操作
    if (hFactor >= 1 || vFactor >= 1) {
        CGSize targetSize;
        if (hFactor > vFactor) {
            targetSize = CGSizeMake(kMaxImageSize.width, originSize.height / hFactor);
        } else {
            targetSize = CGSizeMake(originSize.width / vFactor, kMaxImageSize.height);
        }
        compressedImage = [UIImage compressImage:originImage toSize:targetSize];
    }
    //循环压缩直到小于1MB
    static NSUInteger const k1MB = 1 * 1024 * 1024;
    CGFloat compressionQuality = 1.0f;
    NSData *compressedImageData = UIImageJPEGRepresentation(compressedImage, compressionQuality);
    while (compressedImageData.length > k1MB && compressionQuality > 0) {
        compressionQuality -= 0.1;
        compressedImageData = UIImageJPEGRepresentation(compressedImage, compressionQuality);
    }
    return compressedImageData.length <= k1MB ? compressedImageData : nil;
}

发现一个崩溃 www.jianshu.com/p/387293770…

tableview每次viewwillappear时刷新一个row,在iOS12上会有一个奇怪的抖动,界面先整体上移,又下移。 原因: reloadsectiondata导致的

app检测版本更新时,需要去appstore查询app版本: www.jianshu.com/p/ad3c9ad37…

关于weakself

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.view.backgroundColor = [UIColor whiteColor];
    self.name = @"secviewcontroller";
    __weak typeof(self)weakSelf = self;
    self.myblock = ^(NSInteger num) {
        //__strong typeof(self) strongSelf = weakSelf;
        
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//            NSLog(@"%@",strongSelf);
            //
            NSMutableArray* array = @[].mutableCopy;
            [array addObject:weakSelf.name];
            
        });
    };
}
- (void)viewDidDisappear:(BOOL)animated{
    [super viewDidDisappear:animated];
    self.myblock(12);
}

上边的代码是否会crash,结果看这里

开始的时候我这样传值 服务器报错,解析不了。正确的写法

@{@"did":self.did,@"data":dataArray}

./ 当前目录 ../ 父级目录。/ 根目录。

把字典的key按字母升序生成字符串,如果value为空字符要排除掉。
example:@{"startindex":3,"size":100,"deviceid":""}
string: @"size=100&startindex=3"

 NSArray* keys = [[self.params allKeys]sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
                return [obj1 compare:obj2];
 }];
 [keys enumerateObjectsUsingBlock:^(id  _Nonnull key, NSUInteger idx, BOOL * _Nonnull stop) {
                NSString* value = [ws.params[key]stringValue];
                if (value.length) {
                    paramsStr = [paramsStr stringByAppendingFormat:@"&%@=%@",key,value];
                }
        }];