Xcode7升级之后遇到的问题
 
问题一:
老项目在Xcode6上运行没有任何问题,但在Xcode7上运行直接崩了!
经过一波分析:
发现是因为我顶部状态栏处添加了topWindow,用于处理TableView滚回顶部的业务逻辑,而在Xcode7中window必须要有根控制器,否则直接崩溃,那么只要给这个topWindow设置一个rootViewController,将TableView滚回顶部的代码写在这个控制器去处理即可,解决报错
 
问题二:
在设置rootViewController之后,清空topWindow和rootViewController背景颜色,发现状态栏又不见了?
而且状态栏是否显示、颜色的设置在栈顶控制器(当前显示的控制器)根本无法设置?
 
然后在当前的ViewController里实现prefersStatusBarHidden返回NO,发现没有效果(iOS7开始是由控制器决定是否显示)
那是因为iOS9的状态栏显示隐藏是由最顶层window决定的(也就是我设置的优先级最高的顶部的topWindow)那么就要在window的rootViewController里设置不要隐藏
状态栏隐藏问题解决
同理可在rootViewController实现preferredStatusBarStyle设置状态栏字体颜色;
 
其实解决状态栏问题也可以通过application设置,但是iOS9你会发现设置状态栏的方法都过期,也就是说苹果不推荐我们直接通过application来设置
 
问题三:
当我从一个控制器modal或者push出另一个控制器来,需要修改状态栏时又麻烦了,因为这个时候状态栏颜色和隐藏都是由顶部topWindow的rootViewController决定的
解决方案一:用通知(传参数修改状态栏)
解决方案二:用单例(设计比较简单,清晰)推荐使用这种方法
因为这个topWindow只有一份,设计成单例,并且提供两个属性
@property (nonatomic, assign) UIStatusBarStyle statusBarStyle;
@property (nonatomic, assign) BOOL statusBarHidden; #pragma mark - 状态栏控制
- (BOOL)prefersStatusBarHidden
{
return self.statusBarHidden;
} - (UIStatusBarStyle)preferredStatusBarStyle
{
return self.statusBarStyle;
} #pragma mark - setter
- (void)setStatusBarHidden:(BOOL)statusBarHidden
{
_statusBarHidden = statusBarHidden;
[self setNeedsStatusBarAppearanceUpdate];
} - (void)setStatusBarStyle:(UIStatusBarStyle)statusBarStyle
{
_statusBarStyle = statusBarStyle;
[self setNeedsStatusBarAppearanceUpdate];
}
以后在外部只要拿到单例对象设置他的属性就能修改状态栏了
 

总结:

  在iOS6到iOS8时,我们设置app的状态栏样式,一般把info.plist里面设置了View controller- based status bar appearance为NO,默认为YES,来应用程序来管理。这样的话多window时,并不会有影响状态栏的样式,因为状态栏是由应用UIApplication来管理。

  到了iOS9之后,上面的配置就会就会报警告。对于一名看不得警告的程序员来说,这是很难受的。那么想要消除这些警告,就必须将View controller-based status bar appearance设置为YES(或删除这条配置,因为默认就为YES)。这样的话在单个window时不会出现问题,但是如果你的应用有多个window,且其它的window的显示级别比主window的级别高时就会出现问题。因为状态栏的管理默认是交给最上面那个window的根控制器来管理的。

iOS开发——常见BUG——window决定程序的状态栏管理问题的更多相关文章

  1. iOS开发常见BUG和一些小技巧(ps:耐心看完,很实用)

    [385][scrollView不接受点击事件,是因为事件传递失败] // // MyScrollView.m // Created by beyond on 15/6/6. // Copyright ...

  2. iOS9新特性 window决定程序的状态栏管理问题

    Xcode7升级之后遇到的问题   问题一: 老项目在Xcode6上运行没有任何问题,但在Xcode7上运行直接崩了! 经过一波分析: 发现是因为我顶部状态栏处添加了topWindow,用于处理Tab ...

  3. iOS开发——常见BUG——导航控制器中的子控制器设置StatusBar状态失效的问题

    iOS9之前控制StatusBar的两种方式: 第一种方式:全局控制StatusBar 1. 在项目的Info.plist文件里设置UIViewControllerBasedStatusBarAppe ...

  4. iOS开发 常见错误

    一.NSAppTransportSecurity 错误提示:NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL ...

  5. ios开发-常见的项目文件介绍

    一.项目文件结构示意图 二.文件介绍 1.products文件夹:主要用于mac电脑开发的可执行文件,ios开发用不到这个文件 2.frameworks文件夹主要用来放依赖的框架 3.test文件夹是 ...

  6. iOS开发——常见错误——使用MJRefresh返回上一个界面蹦掉的情况

    最近在使用MJRefresh框架时发现了一个bug 下面是我的源代码 前一个界面 -(void)tableView:(UITableView *)tableView didSelectRowAtInd ...

  7. IOS开发常见第三方总结

    链接](https://github.com/languages​​/Objective-C/most_watched) * [three20](https://github.com/facebook ...

  8. iOS开发常见的宏定义(实用)

    iOS开发过程中使用一些常用的宏可以提高开发效率,提高代码的重用性:将这些宏放到一个头文件里然后再放到工程中的-Prefix.pch文件中(或者直接放到-Prefix.pch中)直接可以使用,灰常方便 ...

  9. iOS开发常见错误解决方法

    1.出现下面的错误: StoryboardApp[8593:207] Failed to instantiate the default view controller for UIMainStory ...

随机推荐

  1. vue中axios发送post请求,后端(@RequestParam)接不到参数

    遇到的问题描述 :axios post 请求,后端接收不到参数. 我们的接口是java,用@RequestParam来接收前端的参数 解决方案:使用qs:axios中已经包含有qs,所以无需重新安装, ...

  2. 用node写个简单的静态服务器

    直接上代码吧,我把它命名为 app.js, 只要在该文件所在目录下,控制台运行 node app.js 即可启动一个本地服务器了. /** * 服务器 * Author jervy * Date */ ...

  3. Educational Codeforces Round 58 (Rated for Div. 2) (前两题题解)

    感慨 这次比较昏迷最近算法有点飘,都在玩pygame...做出第一题让人hack了,第二题还昏迷想错了 A Minimum Integer(数学) 水题,上来就能做出来但是让人hack成了tle,所以 ...

  4. 笔试算法题(25):复制拥有多个指针的链表 & 判断二元树B是否为A的子树

    出题:定义一个复杂链表:在单向链表的基础上,每个节点附加一个指向链表中其他任意节点的指针sibling,实现CNode* Clone(Cnode *head)函数复制这个复杂链表: 分析: 解法1:将 ...

  5. POJ 1995 (快速幂) 求(A1B1+A2B2+ ... +AHBH)mod M

    Description People are different. Some secretly read magazines full of interesting girls' pictures, ...

  6. poj 1088 滑雪 DP(dfs的记忆化搜索)

    题目地址:http://poj.org/problem?id=1088 题目大意:给你一个m*n的矩阵 如果其中一个点高于另一个点 那么就可以从高点向下滑 直到没有可以下滑的时候 就得到一条下滑路径 ...

  7. 笔记——python语言规范

    Lint 对你的代码运行pylint 定义: pylint是一个在Python源代码中查找bug的工具. 对于C和C++这样的不那么动态的(译者注: 原文是less dynamic)语言, 这些bug ...

  8. 笔记——python风格规范

    分号 不要在行尾加分号, 也不要用分号将两条命令放在同一行. 行长度 每行不超过80个字符 例外: 长的导入模块语句 注释里的URL 不要使用反斜杠连接行. Python会将 圆括号, 中括号和花括号 ...

  9. mysql和Oracle 备份表

    1.SQL Server中,如果目标表存在: insert into 目标表 select * from 原表; 2.SQL Server中,,如果目标表不存在: select * into 目标表  ...

  10. Python基础之 一

    语言分类:编译型(运行前先编译)和解释型(直接运行),静态语言(需要声明变量类型)和动态语言(不需要声明),强类型定义语言(定义好类型不做强制转换就不可修改类型)和弱类型定义语言(数据类型可以被忽略) ...