app加载,如何确认默认根控制器

  • app刚刚启动的时候,要去选择他的根控制器,这是每个app必须思考处理的问题,launch的基本事情是这样的,1,2,3,(4一会在讨论)
  func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        //1创建
        window = UIWindow()
        window?.frame = UIScreen.mainScreen().bounds
        //2设置根目录,WXMainController
        window?.rootViewController = defaultRootController() //一个获取默认控制器的方法,在本类中
        //3设置可视化
        window?.makeKeyAndVisible()
        //4注册监听通知
       WXNotificationCenter.addObserver(self, selector: "updateRootViewController:", name: WXChangeRootViewControllerNotification, object: nil)
        return true
    }

但是具体如何选择默认控制器那?我们那微博举例,就是主控制器(要区分是否登录),欢迎控制器,新特性控制器

主控制器(已登录)
未登录页面

ps:注意,已登录,和未登录页面我用的是同一个控制器,只不过是调用这个控制器的时候,重写了load方法,去判断一下是否登录,然后去加载不同的页面

    //loadView
    override func loadView() {
        let usr = WXUser.fetchUserInfo()
        userLogin ? super.loadView() : setupVisitorView()
    }
版本新特性
欢迎页面
  • 那么如何去判断到底如何跳转那,其实基本的app的跳转不外乎这几种
app默认rootVc

在appDelegate类中,可以添加一个方法,专门去判断的默认控制器(如果你认为不好,可以专门提取,做一个工具栏,用来判断)

    /**
     返回默认的根控制器
     
     :returns: 跟控制器
     */
    private func defaultRootController() -> UIViewController{
        //判断是否登录
        if WXUser.isLogin()  //登录了
        {
          //判断是不是新的版本
           return isNewUpdateVersion() ? WXNewFeatureController() : WXWelcomeController()
        }else{//没有登录
           return WXMainController()
        }
    }

判断是不是新的版本

    /**
     判断是不是新的版本
     
     :returns: 是或者不是新版本
     */
    private func isNewUpdateVersion() -> Bool{
        /**
         *  如果是给公司开发些项目,我们比较版本号的规则是:1.冲网络上获取版本号,2.通过键“shortString”来获取该版本号,然后比较,基本不用保存到本地
             但是微博等项目,我们比较的方法确不同:1.通过“shortString”获取该版本号,2.冲本地获取保存的版本号
         */
        //1.通过“shortString”获取该版本号
        let currentVersion = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"] as! String
        //2.本地获取版本
        let saveVersion = NSUserDefaults.standardUserDefaults().objectForKey("BundleVersionString") as? String ?? ""
        //3.比较连个版本
        if currentVersion.compare(saveVersion) == NSComparisonResult.OrderedDescending
        {
            //4.保存新的版本号
        NSUserDefaults.standardUserDefaults().setObject(currentVersion, forKey: "BundleVersionString")
            return true
        }
        return false
    }

说明几点:

  1. 这里要说苹果一个很牛逼的方法,及时compare这个,返回的数据都是字符串,1.2.3空字符串能比较,也可以和1.5比较,太神奇了,

2.NSUserDefaults.standardUserDefaults().objectForKey("BundleVersionString") as? String ?? ""的作用:就是as前边的如果是nil,那么就给他as后边的“”,当然你也可以给他别的~

3.如果在欢迎Vc,或者新版本Vc,最后都要去mainVC,怎么去?
直接使用和这个UIApplication.sharedApplication().keyWindow?.rootViewController = 要选择的控制器,直接给控制器。

4.真实公司的项目,和微博的项目的比较version的区别请认真看上边的那一大段注释文字

5.文章开始的代码中,为毛要注册通知?当我们要在其他控制器设置根控制的时候,直接给Windows.rootVc 设置值就好了,微博项目就有新特性VC欢迎VC需要赋值,不多,但是对于大项目,好多地方可以,所以感觉乱乱的代码,不方便同意管理,所以我认为将他放到appDelegate中统一管理就好,那么问题来了,那么远,怎么管理,聪明的同学想到了就是通知
所以才有了一开始注册通知的代码,既然有注册,就要有移除

  • 移除监听
    deinit{
       WXNotificationCenter.removeObserver(self, name: WXChangeRootViewControllerNotification, object: nil)
    }
  • 接收通知相应的事件
    /**
     当接收通知的时候,用来去更新rootViewcontroller
     ps:接收通知的时候,调用的方法,千万不要去用private修饰,有问题
     :param: notifi 接收的通知
     */
     func updateRootViewController(notifi : NSNotification){
        /** 
         //打印出来的notifi内容
         NSConcreteNotification 0x7f9be950f2a0 {name = WXChangeRootViewControllerNotification; object = 1}
         */
        let isMainVc = notifi.object as! Bool
        if  isMainVc == true {
            window?.rootViewController = WXMainController()
        }else{
            window?.rootViewController = WXWelcomeController()
        }
    }

远处发来幽怨的通知,记住要发true,或者false,我这里是判断去那个页面的

WXNotificationCenter.postNotificationName(WXChangeRootViewControllerNotification, object: true)
  • 你问我这个WXNotificationCenter,WXChangeRootViewControllerNotification,这个为毛写的这么好,可以看看我的另一篇文章ios代码规范

最后还要说明一下,就是swift中如何定义常量字符串和宏定义

1.全局的

let WXChangeRootViewControllerNotification = "WXChangeRootViewControllerNotification"
var WXScreenWidth = UIScreen.mainScreen().bounds.size.width
let WXNotificationCenter = NSNotificationCenter.defaultCenter()

2.私有的

private let reuseIdentifier = "Cell"
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,980评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,422评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,130评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,553评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,408评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,326评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,720评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,373评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,678评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,722评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,486评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,335评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,738评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,283评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,692评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,893评论 2 335

推荐阅读更多精彩内容

  • 1.自定义控件 a.继承某个控件 b.重写initWithFrame方法可以设置一些它的属性 c.在layouts...
    圍繞的城阅读 3,326评论 2 4
  • *7月8日上午 N:Block :跟一个函数块差不多,会对里面所有的内容的引用计数+1,想要解决就用__block...
    炙冰阅读 2,465评论 1 14
  • 不知不觉又搞到这么晚,额,其实和我平时的作息习惯相比,也不是很晚啦,我的主要意思是,又到了一个我觉得可以无所作为的...
    不合理存在阅读 141评论 0 1
  • 你的身体睡了 你的灵魂呢 你的眼睛睡了 你的往事呢 你的耳朵睡了 你的脆弱呢 你的嘴巴睡了 你的想法呢 你睡了 你...
    玩主杨笑阅读 181评论 0 0
  • 感谢师傅小黄河推荐的软件。 开始第一篇吧。 我们来聊聊原生家庭。 第一篇说这个话题是前几天那个虐狗的情人节,隔天我...
    小Q童鞋就是我本人阅读 297评论 1 0