設(shè)置根控制器

控制器:

-主視圖控制器(TabBarViewController)
-訪客視圖控制器(UITableViewController)
-歡迎視圖控制器(UIViewController)
-OAthen授權(quán)視圖控制器(UIViewController)
-子視圖控制器(UITableViewController)

邏輯關(guān)系:

未登錄狀態(tài)下打開App--->訪客視圖
訪客視圖點(diǎn)擊登錄按鈕-->OAthen授權(quán)界面
OAthen授權(quán)后-->歡迎視圖控制器(dismiss OAthen控制器時(shí)發(fā)布通知,切換根控制器)
歡迎視圖控制器結(jié)束-->主控制器(動畫結(jié)束后歡迎視圖控制器再次發(fā)布通知,切換根控制器)

主控制器下的子控制器繼承自訪客視圖控制器,訪客視圖控制器通過是否登錄標(biāo)識判斷顯示登錄或未登錄視圖界面

AppDelegate中代碼示例:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
        
        //設(shè)置主題顏色
        setThemeColor()
        //設(shè)置window
        window = UIWindow(frame: UIScreen.mainScreen().bounds)
        //設(shè)置背景色
        window?.backgroundColor = UIColor.whiteColor()
        //設(shè)置根控制器
        setupRootViewController()
        //設(shè)置主窗口并顯示
        window?.makeKeyAndVisible()
        
        //監(jiān)聽通知
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(changeRootViewController(_:)), name: "changeTootViewControllerNotification", object: nil)
        
        return true
    }
    //設(shè)置根控制器
    func setupRootViewController() -> Void {
        
        if JSUserAccountTools.sharedTools.isLogin {
            //如果用戶已登錄,根控制器是歡迎界面
            window?.rootViewController = JSWelcomeViewController()
        }else {
            //如果用戶未登錄,根控制器是訪客界面
            window?.rootViewController = JSTabBarController()
        }
        
    }
    //切換根控制器
    func changeRootViewController(notic: NSNotification) -> Void {
        
        if notic.object == nil {
            
            window?.rootViewController = JSWelcomeViewController()
        }else {
            
            window?.rootViewController = JSTabBarController()
        }
    }
    
    private func setThemeColor() -> Void{
        
        UITabBar.appearance().tintColor = THEMECOLOR
        UINavigationBar.appearance().tintColor = THEMECOLOR
    }
    
    deinit{
        //移除監(jiān)聽對象
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }

歡迎視圖控制器代碼:

import UIKit
import SDWebImage

class JSWelcomeViewController: UIViewController {

    private lazy var backgroundImageView: UIImageView = UIImageView(imgName: "ad_background")
    
    private lazy var headImageView: UIImageView = {
        let img = UIImageView()
        img.layer.cornerRadius = 45
        img.layer.borderColor = THEMECOLOR.CGColor
        img.layer.borderWidth = 3
        img.clipsToBounds = true
        img.sd_setImageWithURL(NSURL(string: JSUserAccountTools.sharedTools.userAccount?.avatar_large ?? ""), placeholderImage: UIImage(named: "avatar_default_big"))
        return img
    }()
    
    private lazy var messageLabel: UILabel = {
        let lab = UILabel()
        lab.alpha = 0.01
        lab.text = "歡迎回來"
        lab.font = UIFont.systemFontOfSize(18)
        lab.textColor = UIColor.grayColor()
        lab.textAlignment = NSTextAlignment.Center
        return lab
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setUI()
        
    }
    
    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        
        self.headImageView.snp_updateConstraints { (make) in
            make.top.equalTo(self.view).offset(100)
        }
        
        //更改頭像的約束(動畫)
        UIView.animateWithDuration(2.5, delay: 1.5, usingSpringWithDamping: 0.7, initialSpringVelocity: 0, options: [], animations: {
            
            self.view.layoutIfNeeded()
            
            }) { (finished) in
                
                UIView.animateWithDuration(0.25, animations: { 
                    self.messageLabel.alpha = 1
                    
                    
                    }, completion: { (finished) in
                        
                        //切換根控制器
                    NSNotificationCenter.defaultCenter().postNotificationName("changeTootViewControllerNotification", object:"welcome")
                })
        }
        
        
    }
    
    //設(shè)置視圖
    private func setUI() -> Void {
        
        //添加控件
        view.addSubview(headImageView)
        view.addSubview(messageLabel)
        
        //設(shè)置約束
        headImageView.snp_makeConstraints { (make) in
            
            make.top.equalTo(view).offset(400)
            make.centerX.equalTo(view)
            make.size.equalTo(CGSizeMake(90, 90))
        }
        
        messageLabel.snp_makeConstraints { (make) in
            
            make.top.equalTo(headImageView.snp_bottom).offset(16)
            make.centerX.equalTo(view)
        }
        
    }
    
    override func loadView() {
        view = backgroundImageView
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
 

}

OAthen視圖控制器代碼:

import UIKit
import SVProgressHUD
import AFNetworking

class JSOAuthViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        //設(shè)置導(dǎo)航欄按鈕
        setupNav()
        
        
    }
    
    // MARK: - 設(shè)置導(dǎo)航欄按鈕
    private func setupNav ()->() {
        navigationItem.leftBarButtonItem = UIBarButtonItem(title: "取消", style: UIBarButtonItemStyle.Plain, target: self, action: #selector(JSOAuthViewController.cancelClick))
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "自動填充", style: UIBarButtonItemStyle.Plain, target: self, action: #selector(JSOAuthViewController.autoFillClick))
    }
    
    //左側(cè)導(dǎo)航按鈕點(diǎn)擊事件
    @objc private func cancelClick() -> Void {
        dismissViewControllerAnimated(true, completion: nil)
    }
    //右側(cè)導(dǎo)航按鈕點(diǎn)擊事件
    @objc private func autoFillClick ()->() {
        
        let jsString = "document.getElementById('userId').value='授權(quán)賬戶',document.getElementById('passwd').value='密碼'"
        webView.stringByEvaluatingJavaScriptFromString(jsString)
        
    }
    
    override func loadView() {
        view = webView
        view.backgroundColor = UIColor.whiteColor()
        
        
    }
    
    // MARK: - 懶加載控件
    private lazy var webView: UIWebView = {
        
        let view = UIWebView()
        let url = NSURL(string: "https://api.weibo.com/oauth2/authorize?client_id=\(APPKEY)&redirect_uri=\(REDIRECT_URI)")!
        let request = NSURLRequest(URL: url)
        view.loadRequest(request)
        view.delegate = self;
        return view
        
    }()
    
    

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    

}

extension JSOAuthViewController : UIWebViewDelegate{
    
    //開始加載
    func webViewDidStartLoad(webView: UIWebView) {
        
        SVProgressHUD.show()
    }
    //加載完成
    func webViewDidFinishLoad(webView: UIWebView) {
        SVProgressHUD.dismiss()
    }
    //加載失敗
    func webView(webView: UIWebView, didFailLoadWithError error: NSError?) {
        
    }
    //將要加載request
    func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
        
        let urlString = request.URL?.absoluteString
        
        if let u = urlString where u.hasPrefix(REDIRECT_URI) {
            
            //請求參數(shù)鍵值對
            let query = request.URL?.query
            
            if let q = query {
                
                let codeString = q.substringFromIndex("code=".endIndex)
                //請求數(shù)據(jù)
                oauthLoadUser(codeString)
                return false
            }
        }
        
        return true
    }
    
}

extension JSOAuthViewController{
    
    private func oauthLoadUser(code: String) -> Void {
        
        //請求數(shù)據(jù),獲取access_token等信息
        JSNetworkTool.sharedNetworkTool.oauthLoadUserAccount(code, success: { (response) in
            
            guard let res = response as? [String: AnyObject] else {
                
                return
            }
            //字典轉(zhuǎn)模型
            let userAccount = JSUserAccountModel(dict: res)
            
            //請求用戶信息
            self.loadUserInfo(userAccount)
            
            
            }) { (error) in
                
                print(error)
        }
        
        
    }
    
    
    
    //請求用戶信息
    func loadUserInfo(userAccount: JSUserAccountModel) -> Void {
        
        JSNetworkTool.sharedNetworkTool.loadUserInfo(userAccount, success: { (response) in
            
            //判斷是否有值,而且可以轉(zhuǎn)成字典
            guard let res = response as? [String: AnyObject] else {
                
                return
            }
            userAccount.setValue(res["avatar_large"], forKey: "avatar_large")
            userAccount.setValue(res["screen_name"], forKey: "screen_name")
//            userAccount.avatar_large = res["avatar_large"] as? String
//            userAccount.screen_name = res["screen_name"] as? String
            
            JSUserAccountTools.sharedTools.saveUserAccount(userAccount: userAccount)
            //將OAuth控制器移除
            self.dismissViewControllerAnimated(false, completion: {
                //關(guān)閉指示器
                SVProgressHUD.dismiss()
                //切換根控制器
                NSNotificationCenter.defaultCenter().postNotificationName("changeTootViewControllerNotification", object: nil)
            })
            
            }) { (error) in
                
                print(error)
        }
        
    }
    
}

訪客視圖控制器:

class JSVistorTableViewController: UITableViewController {
    
    //標(biāo)識用戶是否登錄
    let isLogin: Bool = JSUserAccountTools.sharedTools.isLogin
    
    //VistorView
    var vistorView: JSVistorView?
    
    override func loadView() {
        
        if isLogin {
            //已登錄
            super.loadView()
            
        }else{
            //未登錄
            setupVistorView()
        }
    }
    
    
    // MARK: - 設(shè)置導(dǎo)航欄
    private func setupNav()-> Void{
        
        navigationItem.leftBarButtonItem = UIBarButtonItem(title: "登錄", style: UIBarButtonItemStyle.Plain, target: self, action: #selector(loginClick))
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "注冊", style: UIBarButtonItemStyle.Plain, target: self, action: #selector(loginClick))
    }

    // MARK: - 導(dǎo)航欄按鈕點(diǎn)擊事件
    @objc private func loginClick() -> Void {
        
        let oauthVc = JSOAuthViewController()
        let naVC = JSNavigationController(rootViewController: oauthVc)
        presentViewController(naVC, animated: true, completion: nil)
        
    }
    
    // MARK: - 設(shè)置訪客視圖
    private func setupVistorView() -> Void {
        
        vistorView = JSVistorView()
        view = vistorView
        vistorView?.closure = {[weak self] in
            
            self?.loginClick()
        }
        
        //設(shè)置導(dǎo)航欄按鈕
        setupNav()
    }
    
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        
    }

    
}

將訪客視圖UI搭建抽取為單獨(dú)一個(gè)類,并提供對外修改UI的方法

// MARK: - 供外界調(diào)用的方法,修改視圖信息
    func setupVistorViewInfo(imgName: String?,title: String?) -> Void {
        
        if  let img = imgName,let tit = title {
            //非主頁
            centerImageView.image = UIImage(named: img)
            messageLabel.text = tit
            feedImageView.removeFromSuperview()
            
        }else{
            
            //主頁:設(shè)置動畫
            setupAnim()
        }
        
    }

將OAthen授權(quán)獲得的數(shù)據(jù),存放到一個(gè)單例類中,同時(shí)做本地化處理,并存放是否登錄的標(biāo)識,防止每一次使用信息都對沙盒進(jìn)行操作

class JSUserAccountTools: NSObject {
    
    //全局訪問點(diǎn)
    static let sharedTools: JSUserAccountTools = JSUserAccountTools()
    
    var userAccount: JSUserAccountModel?
    
    var accessToken: String?{
        
        if userAccount?.access_token == nil {
            //如果訪問令牌為nil,代表未登錄,返回nil
            return nil
            
        }else {
            
            if userAccount?.expires_Date?.compare(NSDate()) == NSComparisonResult.OrderedDescending {
                //訪問令牌不為nil,與當(dāng)前時(shí)間比較為降序,未過期,代表登錄
                return userAccount?.access_token
                
            }else {
                //如果訪問令牌不為nil,但是時(shí)間過期,代表未登錄
                return nil
            }
            
            
        }
    }
    
    //判斷用戶是否登錄標(biāo)識
    var isLogin: Bool {
        //如果access_token為nil,代表沒登錄(如果accessToken為nil,代表isLogin = false)
        return accessToken != nil
    }
    
    override init() {
        super.init()
        userAccount = getUserAccount()
    }
    
    let path = (NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! as NSString).stringByAppendingPathComponent("userAccount.archiver")
    
    
    //保存對象
    func saveUserAccount(userAccount userAcc: JSUserAccountModel) -> Void {
        
        self.userAccount = userAcc
        //歸檔
        NSKeyedArchiver.archiveRootObject(userAcc, toFile: path)
        
    }
    //獲取對象
    func getUserAccount() -> JSUserAccountModel? {
        //解檔
        let userAccount = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as? JSUserAccountModel
        return userAccount
    }

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末不脯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子刻诊,更是在濱河造成了極大的恐慌防楷,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坏逢,死亡現(xiàn)場離奇詭異域帐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)是整,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來民假,“玉大人浮入,你說我怎么就攤上這事⊙蛞欤” “怎么了事秀?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長野舶。 經(jīng)常有香客問我易迹,道長,這世上最難降的妖魔是什么平道? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任睹欲,我火速辦了婚禮,結(jié)果婚禮上一屋,老公的妹妹穿的比我還像新娘窘疮。我一直安慰自己,他們只是感情好冀墨,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布闸衫。 她就那樣靜靜地躺著,像睡著了一般诽嘉。 火紅的嫁衣襯著肌膚如雪蔚出。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天虫腋,我揣著相機(jī)與錄音骄酗,去河邊找鬼。 笑死岔乔,一個(gè)胖子當(dāng)著我的面吹牛酥筝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播雏门,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼嘿歌,長吁一口氣:“原來是場噩夢啊……” “哼掸掏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起宙帝,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤丧凤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后步脓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體愿待,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年靴患,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了仍侥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鸳君,死狀恐怖农渊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情或颊,我是刑警寧澤砸紊,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站囱挑,受9級特大地震影響醉顽,放射性物質(zhì)發(fā)生泄漏平挑。R本人自食惡果不足惜游添,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一弹惦、第九天 我趴在偏房一處隱蔽的房頂上張望否淤。 院中可真熱鬧,春花似錦棠隐、人聲如沸石抡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽啰扛。三九已至,卻和暖如春嗡贺,著一層夾襖步出監(jiān)牢的瞬間隐解,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工诫睬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留煞茫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像续徽,于是被迫代替她去往敵國和親蚓曼。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容