質問
現在、ビューワーアプリを製作中です。
メインのViewControllerクラスで定義した変数を色々なクラスで参照したいため、ViewControllerをグローバルで定義したいと思っています。
グローバルで定義しても問題ありませんでしょうか。
サンプルアプリを見ていると大抵AppDelegateクラス内で定義されています。
グローバルで定義して試してみたところ動作的には問題なさそうですが、今後致命的な問題が出ないか心配です。
また、その他に良い方法がありましたら教えていただきたいです。
初歩的な質問で申し訳ありませんが、ご教示のほどお願い申し上げます。
該当のソースコード
swift5
1 2///********グローバルで定義 3var g_Vc : ViewController! // 共用ビューコントローラー 4 5 6///******** ViewController 7class ViewController: UIViewController{ 8 9 var appDelegate:AppDelegate = UIApplication.shared.delegate as! AppDelegate 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 } 14} 15 16 17///******** AppDelegate 18@UIApplicationMain 19class AppDelegate: UIResponder, UIApplicationDelegate{ 20 21 var window: UIWindow? 22 var NaviController: NavigationController? 23 24 // アプリを起動する際に呼び出されるメソッド 25 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 26 27 // ウィンドウの設定 28 g_Vc = ViewController() 29 NaviController = NavigationController(rootViewController: g_App.m_Vc) 30 self.window = UIWindow(frame: UIScreen.main.bounds) 31 self.window?.rootViewController = NaviController 32 self.window?.backgroundColor = UIColor.white 33 self.window?.makeKeyAndVisible() 34 35 return true 36 } 37} 38
補足情報
Xcode:Version 10.2
Swift5
iOS12.2
AppDelegateの派生クラスを利用すれば良いのでは?
t_obara様
教えていただきありがとうございます。
>AppDelegateの派生クラスを利用すれば良いのでは?
すみません。
派生クラスを具体的にどのように利用すれば良いのか教えていただけますでしょうか。
申し訳ありませんがよろしくお願いいたします。
すでに提示されたコードでも利用されている様に、AppDelegateをViewから参照している様に、どこからでも参照できるクラスがあるのであれば、グローバルのViewControllerの代わりに、そちらに必要な情報を設定すれば良いという意図です。
t_obara様
教えていただきありがとうございます。
どこからでも利用できるクラスを用意すれば良いのですね。
例えば、ViewControllerを直接グローバルにではなく、以下のようにどこからでも参照できるクラス内にViewControllerを定義するということであっていますでしょうか。
**************************************
var g_App = App()
class App{
var m_Vc : ViewController! // 共用ビューコントローラー
}
class AppDelegate: UIResponder, UIApplicationDelegate{
〜〜
// アプリを起動する際に呼び出されるメソッド
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
g_App. m_Vc = ViewController()
〜〜
}
}
**************************************
まず、ViewControllerはViewの振る舞いを制御するものなので、共有しない方が良いです。振る舞いに影響を与える変数などを共有すべきです。
また、g_Appって結局グローバル変数と同義です。g_Appなんて定義しなくてもすでにAppDelegateが参照できるので、それ経由でアクセスすれば良いという提案です。AppDelegateのメンバ変数や、別に定義したクラスインスタンスを持たせれば良いです。
t_obara様
丁寧に教えていただきありがとうございます。
理解不足で申し訳ありません。
以下のようにAppDelegate内に参照したい変数を定義して、
他の色々なクラスで参照したいときは、UIApplicationからdelegateを取得してアクセスするということであっていますでしょうか。
**************************************
class AppDelegate: UIResponder, UIApplicationDelegate{
〜〜
var m_sansyo : Int = 0 // 参照したい変数
〜〜
}
**************************************
class 色々なクラス{
〜〜
var appDelegate:AppDelegate = UIApplication.shared.delegate as! AppDelegate
// 参照したい変数を取得
func getsansyo() -> Int {
return appDelegate. m_sansyo
}
〜〜
}
やってみましょう。デバッガで参照するとよくわかるかと思います。
t_obara様
やってみました。上記の方法で無事に参照することができました。
AppDelegateを利用することで、グローバル変数にしなくても済むのですね。
AppDelegateについてはよくわからない部分が多かったのでこれから勉強します。
ありがとうございました。
回答1件
あなたの回答
tips
プレビュー