★ 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")
}
}
★ 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)
}
}