#はじめに
画面間でのデータ共有の方法の1つにAppDelegate
を使用する方法があるらしい。
いろんなデータの共有の仕方がありますが、割とシンプルな方法かなと思います。
実際に試してみたので、記事にしてみます。
#AppDelegateとは
全ての画面からアクセスできるようになっているファイルになります。
なので、ここに変数を定義する事でデータを共有する事ができるという訳です。
#使ってみた
今回はTabBarController
を使用して画面間でのデータ共有をしたいと思います。
青のviewのtextField
に入力したデータを保存ボタンで黄色のtextField
に渡します。
AppDelagate
の中に変数を用意します。
ボタンの処理は以下の通りです。
AppDelegateにアクセスするために定数delegate
を用意して、定数にアクセスするための処理を入れます。
以下のコードにアクセスしたいので、let delegate = UIApplication.shared.delegate as! AppDelegate
とします。
取り出したい変数はAppDelegate型の中にあるので、as!でAppDelegate型に変換して取り出します。(この辺りの説明自信ない)
class AppDelegate: UIResponder, UIApplicationDelegate {
var shareData:String = ""
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
return true
}
// MARK: UISceneSession Lifecycle
func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
// Called when a new scene session is being created.
// Use this method to select a configuration to create the new scene with.
return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
}
func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
// Called when the user discards a scene session.
// If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
// Use this method to release any resources that were specific to the discarded scenes, as they will not return.
}
}
そして、textFieldに入力された文字をAppDelegate
に用意した変数に入れます。
@IBAction func buttonAction(_ sender: Any) {
let delegate = UIApplication.shared.delegate as! AppDelegate
delegate.shareData = blueTextField.text!
}
YellowViewController
ではviewWillAppear
を使用して、切り替わるたびにデータを表示するようにします。
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let delegate = UIApplication.shared.delegate as! AppDelegate
yellowTextField.text = delegate.shareData
}
#今回のコード
import UIKit
class BlueViewController: UIViewController {
@IBOutlet var blueTextField: UITextField!
@IBAction func buttonAction(_ sender: Any) {
let delegate = UIApplication.shared.delegate as! AppDelegate
delegate.shareData = blueTextField.text!
}
}
import UIKit
class YellowViewController: UIViewController {
@IBOutlet var yellowTextField: UITextField!
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let delegate = UIApplication.shared.delegate as! AppDelegate
yellowTextField.text = delegate.shareData
}
}