- app剛剛啟動的時候翼抠,要去選擇他的根控制器,這是每個app必須思考處理的問題获讳,launch的基本事情是這樣的,1,2,3阴颖,(4一會在討論)
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
//1創(chuàng)建
window = UIWindow()
window?.frame = UIScreen.mainScreen().bounds
//2設置根目錄,WXMainController
window?.rootViewController = defaultRootController() //一個獲取默認控制器的方法,在本類中
//3設置可視化
window?.makeKeyAndVisible()
//4注冊監(jiān)聽通知
WXNotificationCenter.addObserver(self, selector: "updateRootViewController:", name: WXChangeRootViewControllerNotification, object: nil)
return true
}
但是具體如何選擇默認控制器那丐膝?我們那微博舉例量愧,就是主控制器(要區(qū)分是否登錄),歡迎控制器,新特性控制器
ps:注意尤误,已登錄,和未登錄頁面我用的是同一個控制器结缚,只不過是調(diào)用這個控制器的時候损晤,重寫了load方法,去判斷一下是否登錄红竭,然后去加載不同的頁面
//loadView
override func loadView() {
let usr = WXUser.fetchUserInfo()
userLogin ? super.loadView() : setupVisitorView()
}
- 那么如何去判斷到底如何跳轉那尤勋,其實基本的app的跳轉不外乎這幾種
在appDelegate類中喘落,可以添加一個方法,專門去判斷的默認控制器(如果你認為不好最冰,可以專門提取瘦棋,做一個工具欄,用來判斷)
/**
返回默認的根控制器
:returns: 跟控制器
*/
private func defaultRootController() -> UIViewController{
//判斷是否登錄
if WXUser.isLogin() //登錄了
{
//判斷是不是新的版本
return isNewUpdateVersion() ? WXNewFeatureController() : WXWelcomeController()
}else{//沒有登錄
return WXMainController()
}
}
判斷是不是新的版本
/**
判斷是不是新的版本
:returns: 是或者不是新版本
*/
private func isNewUpdateVersion() -> Bool{
/**
* 如果是給公司開發(fā)些項目暖哨,我們比較版本號的規(guī)則是:1.沖網(wǎng)絡上獲取版本號赌朋,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
}
說明幾點:
- 這里要說蘋果一個很牛逼的方法,及時compare這個达布,返回的數(shù)據(jù)都是字符串团甲,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的區(qū)別請認真看上邊的那一大段注釋文字
5.文章開始的代碼中扰路,為毛要注冊通知?當我們要在其他控制器設置根控制的時候倔叼,直接給Windows.rootVc 設置值就好了汗唱,微博項目就有新特性VC,歡迎VC需要賦值丈攒,不多哩罪,但是對于大項目,好多地方可以巡验,所以感覺亂亂的代碼际插,不方便同意管理,所以我認為將他放到appDelegate中統(tǒng)一管理就好显设,那么問題來了框弛,那么遠,怎么管理捕捂,聰明的同學想到了就是通知瑟枫!
所以才有了一開始注冊通知的代碼斗搞,既然有注冊,就要有移除
- 移除監(jiān)聽
deinit{
WXNotificationCenter.removeObserver(self, name: WXChangeRootViewControllerNotification, object: nil)
}
- 接收通知相應的事件
/**
當接收通知的時候慷妙,用來去更新rootViewcontroller
ps:接收通知的時候僻焚,調(diào)用的方法,千萬不要去用private修飾膝擂,有問題
:param: notifi 接收的通知
*/
func updateRootViewController(notifi : NSNotification){
/**
//打印出來的notifi內(nèi)容
NSConcreteNotification 0x7f9be950f2a0 {name = WXChangeRootViewControllerNotification; object = 1}
*/
let isMainVc = notifi.object as! Bool
if isMainVc == true {
window?.rootViewController = WXMainController()
}else{
window?.rootViewController = WXWelcomeController()
}
}
遠處發(fā)來幽怨的通知虑啤,記住要發(fā)true,或者false猿挚,我這里是判斷去那個頁面的
WXNotificationCenter.postNotificationName(WXChangeRootViewControllerNotification, object: true)
- 你問我這個
WXNotificationCenter
,WXChangeRootViewControllerNotification
咐旧,這個為毛寫的這么好,可以看看我的另一篇文章ios代碼規(guī)范
最后還要說明一下绩蜻,就是swift中如何定義常量字符串和宏定義
1.全局的
let WXChangeRootViewControllerNotification = "WXChangeRootViewControllerNotification"
var WXScreenWidth = UIScreen.mainScreen().bounds.size.width
let WXNotificationCenter = NSNotificationCenter.defaultCenter()
2.私有的
private let reuseIdentifier = "Cell"