文档章节

不用的Main.storyboard要删掉

yoyoso
 yoyoso
发布于 2016/03/01 10:19
字数 502
阅读 655
收藏 1

项目的app刚开始运行时,Xcode console log一直有一个警告:Unknown class ViewController in Interface Builder file,因为没影响app运行,所以一直没管。今天遇到一个问题才发现不能无视它。

先说说问题的背景,我用了Coding iOS开源代码的一个方法,如下所示,主要用于在代码中任何地方获取当前展示最前面的VC:

+ (UIViewController *)presentingVC{
    UIWindow * window = [[UIApplication sharedApplication] keyWindow];
    if (window.windowLevel != UIWindowLevelNormal)
    {
        NSArray *windows = [[UIApplication sharedApplication] windows];
        for(UIWindow * tmpWin in windows)
        {
            if (tmpWin.windowLevel == UIWindowLevelNormal)
            {
                window = tmpWin;
                break;
            }
        }
    }
    UIViewController *result = window.rootViewController;
    while (result.presentedViewController) {
        result = result.presentedViewController;
    }
    if ([result isKindOfClass:[RootTabViewController class]]) {
        result = [(RootTabViewController *)result selectedViewController];
    }
    if ([result isKindOfClass:[UINavigationController class]]) {
        result = [(UINavigationController *)result topViewController];
    }
    return result;
}

根据上面的代码,在keyWindow的windowLevel不是UIWindowLevelNormal时,就会进入一个for循环来找到windowLevel为UIWindowLevelNormal的window。而上面的问题的存在,就让我们找到一个错误的window,虽然它的windowLevel也是UIWindowLevelNormal。

等同于在windows里,有两个windowLevel都为UIWindowLevelNormal的window,这是为什么呢?

追根究底,还是要回到本文开始的那个警告,出现那个警告的原因是你的项目里有一个Main.storyboard,但 AppDelete的rootViewController跟它完全没有关联,而是使用了自定义的rootViewController。

问题是:你不用不代表它完全没有存在性。实际上是:App在开始运行时,仍然会默认基于Main.storyboard创建window,只不过它的rootviewcontroller为空,同时它的windowLevel为UIWindowLevelNormal。

而在AppDelete中使用自定义的rootViewController前,又自行创建了一个window:self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];——它的windowLevel也为UIWindowLevelNormal。

当你使用自定义的VC赋值给rootViewController时,Main.storyboard对应的window并没有自动删掉,这就导致两个windowLevel同为UIWindowLevelNormal的存在,也就导致上面的代码找到了错误的window。


所以,不用的Main.storyboard还是删掉为好,删除办法是:

1. 在文件列表里把Main.storyboard删除掉。

2. 删掉格式文件Info.plist中对应的键值,即删掉Main storyboard file base name...main

© 著作权归作者所有

共有 人打赏支持
yoyoso
粉丝 48
博文 125
码字总数 44507
作品 0
南京
高级程序员
Xcode 4-PBXcp error修复-No such file or directory

本文主要参考Xcode 4-PBXcp error修复-No such file or directory,并做了一些更新。 接手了一个新项目,真机编译时总是提示“PBXcp error-No such file or directory”这个错误,就是看了上...

yoyoso
2015/02/27
0
0
报错-Unknown class in Interface Builder file

Xcode7报错: Unknown class in Interface Builder file. 2015-10-31 10:14:55.423 swift-UINavigationController[7741:1519031] Unknown class ViewController in Interface Builder file. ......

王永濤
2015/10/31
0
0
iOS开发之退出功能(易错)

如果,我们有两个控制器,第一个控制器是MainController,它是与Main.storyboard相关联的。第二个控制器是myController。假设myController中有一个退出按钮,点击退出按钮从myController返回...

feng_blog
2015/08/31
107
0
iOS手动加载Main.storyboard

手动加载Main.storyboard 1.第一步设置 去掉MAIN 2.第二步设置 3.github代码地址 github

AppleDream
2016/06/09
44
0
iOS应用国际化教程(2014版)

本文最初由Sean Berry撰写,由Ali Hafizji针对iOS 7进行了更新。 开发一款伟大的iOS应用程序是件了不起的事情,但是还有比优秀的代码、华丽的设计以及直观化交互更多的事要做。跻身在App Sto...

mingxun
2014/06/04
0
2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

RabbitMQ在CentOS环境安装

1.废话不多说准备一台虚拟机,系统为centos,我这里使用的系统版本如下图所示:

凌晨一点
47分钟前
0
0
线程池相关

在java.util.concurrent包下,提供了一系列与线程池相关的类。 使用线程池的好处 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗; 提高响应速度。当任务到达时,任务...

edwardGe
49分钟前
0
0
学习大数据这三个关键技术是一定要掌握!

大数据时代全面来临,大数据、人工智能等技术引领科技创新潮流,获得国家政策大力支持,前景广阔。学习大数据技术的人自然是络绎不绝, 学习大数据虽然是一个趋势,但也要注意大数据培训课程...

董黎明
今天
0
0
jetbrains 上传代码到github

设置中找github 获取token 验证是否成功 测试git 生成key,一路回车即可 ssh-keygen -t rsa -C “youremail@example.com” 打开pub复制key,需要再次输入一次密码 验证是否成功,输入yes即可...

阿豪boy
今天
0
0
分布式服务框架(拾遗)

前言 现在的大部分工程都已经是基于分布式架构来处理。所以这里对分布式框架做一个简单的总结 常用的RPC框架 RPC框架原理 RPC(Remote Procedure Call,远程过程调用)一般用来实现部署在不同...

kukudeku
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部