iOS学习笔记:更新Xcode9后用iPhone X 运行遇到的一些问题

1. 控制台打印线程问题

Main Thread Checker: UI API called on a background thread: -[UIApplication statusBarOrientation]

PID: 4940, TID: 93956, Thread name: (none), Queue name: WriteLogQueue, QoS: 0

造成原因是因为原本 需要在主线程执行的代码 被放在了子线程里边

解决方法:在scheme 里边取消主线程检测 (不建议使用) 建议修改代码 把出问题的代码放在主线程里面就行了

 

 

2.运行程序直接崩溃问题,起初崩溃直接跳到main.m文件中 控制台打印的日志也是一堆毫无头绪的东西,没有报错信息,也没告诉崩在哪里,

搜索半天没有有效解决方法,所以就开始了最基本的断点调试,一点点调试之后报错提示变成了下面:给了详细的报错信息 

[Bugly]  Trapped uncaught exception 'NSUnknownKeyException', reason: '[<UIStatusBar_Modern 0x7fab69509e40> valueForUndefinedKey:]: this class is not key value coding-compliant for the key foregroundView.' 

(

0   CoreFoundation                      0x000000010b81612b __exceptionPreprocess + 171

1   libobjc.A.dylib                     0x000000010a92bf41 objc_exception_throw + 48

2   CoreFoundation                      0x000000010b816079 -[NSException raise] + 9

3   Foundation                          0x000000010a4179ae -[NSObject(NSKeyValueCoding) valueForUndefinedKey:] + 226

4   Foundation                          0x000000010a342d80 -[NSObject(NSKeyValueCoding) valueForKey:] + 284

5   chenghuiguang                       0x0000000104d50335 -[BaseNetWorkService addHeader] + 1125

6   chenghuiguang                       0x0000000104d4f9b6 -[BaseNetWorkService initOperationManager] + 854

7   chenghuiguang                       0x0000000104d4f622 -[BaseNetWorkService init] + 114

8   chenghuiguang                       0x0000000104eb481e -[WaittingViewController initData] + 62

9   chenghuiguang                       0x0000000104eb4799 -[WaittingViewController viewDidLoad] + 73

.

.


根据报错提示找到了我的BaseNetWorkService文件下 addHeader方法,再根据错误提示搜索 查到了崩溃的原因 ,

详细解答请参考链接:http://blog.csdn.net/lucky_xiaofeng310/article/details/78359336

 

由于iPhone X的状态栏是和其他版本手机差异比较大的,因此api 变化也比较大, iPhone X的状态栏是多嵌套了一层,多取一次即可

我的项目中用到了 使用状态栏中图标判断当前网络的具体状态 ,所以用 iPhone X运行崩溃了

 

不能直接用 

[[[[UIApplication sharedApplication] valueForKeyPath:@"_statusBar"] valueForKeyPath:@"foregroundView"] subviews];

需要做判断UIStatusBar_Modern

    NSArray *subviewArray;

    // 不能用 [[self deviceVersion] isEqualToString:@"iPhone X"] 来判断,因为模拟器不会返回 iPhone X

    if([[[UIApplication sharedApplication] valueForKeyPath:@"_statusBar"] isKindOfClass:NSClassFromString(@"UIStatusBar_Modern")]) {

        subviewArray = [[[[[UIApplication sharedApplication] valueForKeyPath:@"_statusBar"] valueForKeyPath:@"_statusBar"] valueForKeyPath:@"foregroundView"]       subviews];

    } else {

        subviewArray = [[[[UIApplication sharedApplication] valueForKeyPath:@"_statusBar"] valueForKeyPath:@"foregroundView"] subviews];

    }

 如下图:

 

posted @ 2017-12-30 16:20  ❀__wagmeღ  阅读(522)  评论(0编辑  收藏  举报