Skip to content

Instantly share code, notes, and snippets.

@KentarouKanno
Last active September 22, 2017 02:57
Show Gist options
  • Save KentarouKanno/af4a0805aa0ef4e43a3d to your computer and use it in GitHub Desktop.
Save KentarouKanno/af4a0805aa0ef4e43a3d to your computer and use it in GitHub Desktop.
UIViewController

UIViewController

アプリの状態とマルチタスキング

★ UIViewController Life Cycle

// Storyboardから生成した場合

import UIKit

class ViewController: UIViewController {
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        print("init(coder: aDecoder)")
        
        NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("willResignActiveNotification:"), name: UIApplicationWillResignActiveNotification , object: nil)
        NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("didEnterBackgroundNotification:"), name: UIApplicationDidEnterBackgroundNotification , object: nil)
        NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("willEnterForegroundNotification:"), name: UIApplicationWillEnterForegroundNotification , object: nil)
        NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("didBecomeActiveNotification:"), name: UIApplicationDidBecomeActiveNotification , object: nil)
    }
    
    func willEnterForegroundNotification(notification: NSNotification) {
        print("willEnterForegroundNotification")
    }
    
    func didBecomeActiveNotification(notification: NSNotification) {
        print("didBecomeActiveNotification")
    }
    
    func didEnterBackgroundNotification(notification: NSNotification) {
        print("didEnterBackgroundNotification")
    }
    
    func willResignActiveNotification(notification: NSNotification) {
        print("willResignActiveNotification")
    }
    
    func willTerminateNotification(notification: NSNotification) {
        print("willTerminateNotification")
    }
    
    
    override func awakeFromNib() {
        super.awakeFromNib()
        print("awakeFromNib")
    }
    
    override func loadView() {
        super.loadView()
        print("loadView")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        print("viewDidLoad")
    }
    
    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        print("viewWillAppear")
    }
    
    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        print("viewDidAppear")
    }
    
    override func viewWillDisappear(animated: Bool) {
        super.viewWillDisappear(animated)
        print("viewWillDisappear")
    }
    
    override func viewDidDisappear(animated: Bool) {
        super.viewDidDisappear(animated)
        print("viewDidDisappear")
    }
    
    override func viewWillLayoutSubviews() {
        //super.viewWillLayoutSubviews()
        print("viewWillLayoutSubviews")
    }
    
    override func viewDidLayoutSubviews() {
        //super.viewDidLayoutSubviews()
        print("viewDidLayoutSubviews")
    }
    
    deinit {
        NSNotificationCenter.defaultCenter().removeObserver(self)
        print("deinit")
    }
    
    /*
    init(coder: aDecoder)

    awakeFromNib

    loadView

    viewDidLoad

    viewWillAppear

    viewWillLayoutSubviews

    viewDidLayoutSubviews

    viewDidAppear

    viewWillLayoutSubviews

    viewDidLayoutSubviews

    画面表示完了

    viewWillDisappear

    viewWillLayoutSubviews

    viewDidLayoutSubviews

    viewDidDisappear

    deinit
    
    バックグラウンド遷移時
    willResignActiveNotification

    didEnterBackgroundNotification
    
    起動時
    willEnterForegroundNotification

    didBecomeActiveNotification
    
    */
}

★ ソースコードからViewControllerを生成する場合の記述

import UIKit

class ViewController: UIViewController {
    
    // required!
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        print("init(coder: aDecoder)")
    }
    
    /* Not call
    override func awakeFromNib() {
        super.awakeFromNib()
        print("awakeFromNib")
    }
    */
    
    override init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!) {
        super.init(nibName: nil, bundle: nil)
        print("init(nibName: nil, bundle: nil)")
    }
    
    convenience init() {
        self.init(nibName: nil, bundle: nil)
        print("init()")
    }
    
    override func loadView() {
        super.loadView()
        print("loadView")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        print("viewDidLoad")
        
         self.view.backgroundColor = UIColor.yellowColor()
    }
    
    /*
    init(nibName: nil, bundle: nil)

    init()

    loadView

    viewDidLoad
    */
}

// 生成

let VC = ViewController()
navigationController?.pushViewController(VC, animated: true)

★ Viewがloadされたかを取得する

let isLoaded = isViewLoaded()

// init(coder: aDecoder) では false
// awakeFromNib では false
// loadView 以降はtrue

★ ViewControllerのいるStoryboardを取得する

let myStoryboard = storyboard

// storyboard IDを指定して画面遷移する
if let VC = storyboard?.instantiateViewControllerWithIdentifier("VCname") {
    presentViewController(VC, animated: true, completion: nil)
}

★ 編集状態に入る、やめる

self.editing = true
self.editing = false

// アニメーションの有無
self.setEditing(true, animated: true)
self.setEditing(false, animated: false)

★ ViewControllerとアニメーションの有無を指定して画面を遷移する

presentViewController(VC, animated: true, completion: nil)

// 画面表示アニメーション後の処理を記述
presentViewController(VC, animated: true, completion: { () -> Void in
    // 画面表示アニメーション後の処理
})

★ Storyboardを使わないUINavigationController

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        
        
        let  viewController = ViewController()
        let  navigationController = UINavigationController(rootViewController: viewController)
    
        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        self.window!.rootViewController = navigationController
        
        self.window!.backgroundColor = UIColor.whiteColor()
        self.window!.makeKeyAndVisible()
        
        return true
    }
}

★ presentViewControllerするUIViewControllerのViewを透明にする
参考URL: OverCurrentContext

import UIKit

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
    }
    
    // OverCurrentContextを使用時は以下のメソッドは呼ばれない
    // ※ 遷移前、遷移後
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        print("viewWillAppear")
    }
    
    override func viewDidAppear(_ animated: Bool) {
        
        print("viewDidAppear")
        
        let vc = storyboard?.instantiateViewController(withIdentifier: "Next") as! NextViewController
        vc.modalPresentationStyle = .overCurrentContext
        vc.view.backgroundColor = UIColor.clear
        present(vc, animated: true, completion: nil)
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        print("viewWillDisappear")
    }
    
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        print("viewDidDisappear")
    }
}

s

★ Modal遷移から戻った時に前画面(Modal画面)のオブジェクトを取得する

// viewWillAppearでないと取得できない
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    
    // ViewController1から戻った時に取得する
    if let vc = presentedViewController as? ViewController1 {
        dump(vc.view.tag)
    }
}

★ Modal遷移での遷移先画面で遷移前のオブジェクトを取得する      

// この場合はNavigationControllerが付いているViewControllerからの遷移
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    
    if let navi = self.presentingViewController as? UINavigationController,
        let first = navi.viewControllers.first,
        let vc = first as? ViewController {
        print(vc.view.tag)
    }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment