読者です 読者をやめる 読者になる 読者になる

そーす

福岡在住のプログラマ。SwiftとかKotlinとかJavascriptとかSketchとか触ってます。

「追記あり」最前面のViewControllerにForeground/Backgroundのイベントを通知する

f:id:saburesan:20160427075732p:plain

【追記】 最前面の取得方法にミスあったのでこっちを参照

saburesan.hatenablog.com




AndroidやってたのでiOSのviewDidAppearとAndroidのonResumeっておんなじなのかと思ってたのですが、どうやら全然違うらしくちょっとハマりました。

ネットで調べるとNotificationCenterを使う記事が多いのですが、個人的に微妙だったので、extentionを使う方法で実装しました。

UIViewControllerのExtention

import Foundation
import UIKit

extension UIViewController {
    func applicationDidEnterBackground(application: UIApplication) {
    }

    func applicationWillEnterForeground(application: UIApplication) {
    }
}

AppDelegateから最前面のViewControllerのメソッドを呼ぶ

func applicationDidEnterBackground(application: UIApplication) {
        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
        getCurrentTopViewController()?.applicationDidEnterBackground(application)
    }

    func applicationWillEnterForeground(application: UIApplication) {
        // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
        getCurrentTopViewController()?.applicationWillEnterForeground(application)
    }

    func getCurrentTopViewController() -> UIViewController? {
        if let rootViewController = window?.rootViewController {
            if rootViewController is UINavigationController {
                return (rootViewController as! UINavigationController).topViewController
            } else if rootViewController is UITabBarController {
                return (rootViewController as! UITabBarController).selectedViewController
            } else {
                return rootViewController
            }
        }
        return nil
    }