2016-10-07 7 views
0

私としてRootViewControllerを継承oneViewControllerとtwoViewControllerという名前なぜ継承された変数が迅速に初期化されないのですか?

import UIKit 
class RootViewController: UIViewController { 
    var amIaccessible: Bool = false 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 
} 

と2サブコントローラとしてRootViewControllerという名前のメインのUIViewControllerを持っています(また、私のコメントを読んで)今

import UIKit 
class oneViewController: RootViewController { 
    var amIaccessible: Bool = false 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     amIaccessible = true // I have initialized this variable of RootViewController 
    } 
} 

import UIKit 
class twoViewController: RootViewController { 
    var amIaccessible: Bool = false 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     print(amIaccessible) // it should print true as initialized in oneViewController but its printing false :(
    } 
} 

問題私のoneViewControllerは私のアプリケーションの初期ビューであり、twoViewControllerは最初のビューの後に初期化された2番目のビューなので、私はルートを必要としますViewControllerは、私の変数とメソッドをアプリのライフサイクル全体にわたって保持することができる私のシングルトンタイプのコントローラです。どのように私はこれを達成することができる?

私は、別のシングルトンクラスのようなソリューションは必要ありません。私は、アプリ実行中に変数を保持できる共有インスタンスを作成することもできます。 ので、ここで継承関係

+2

sepの代わりにビューコントローラに変数を配置する際の問題(私が確かに推奨する)アライメントモデルオブジェクトは、View Controllerのライフサイクルを制御しないということです。 iOSはそれらを自由に作成して破壊します。そのことについては何もできません。そのシングルトンオブジェクトへのアクセスを透過的にする場合は、集計されたプロパティまたは関数をベースビューコントローラに追加して、集中シングルトンへのアクセスを非表示にします。 – dasblinkenlight

+1

クラスの継承がどのように機能するか誤解しています。 'RootViewController'はシングルトンではありません。それはあなたの2つの他のView Controllerのそれぞれのスーパークラスです。各ビューコントローラには、 'RootViewController'によって宣言されたプロパティの独自のインスタンスがあります。一つのビューコントローラインスタンスで' super.amIaccessible'を変更しても、別のビューコントローラインスタンスの値は変更されません。 – Paulw11

答えて

0

を使用して私に解決策を与えてください、あなたがこの

class oneViewController: RootViewController { 
var amIaccessible: Bool = false // here you are overridding the amIaccessible property. so if you will use this with oneViewController object it will always gives you overridden property value 

override func viewDidLoad() { 
    super.viewDidLoad() 
    amIaccessible = true // here you are changing the overridden amIaccessible property value. if you want to change super class propert value you should use super keyword. 
    print(self.amIaccessible) // true 
    print(super.amIaccessible) // false 


    // for e.g super.amIaccessible = true // in the same way access it with super keyword. 
} 
} 

になりますいくつかのものがあり、twoViewControllerにあなたがRootViewControllerのamIaccessibleプロパティにアクセスしたい場合場合は、プロパティでスーパーを使用する必要がありますamIaccessibleプロパティの値をoneViewControllerから変更すると、すべてのオブジェクトに対して新しいプロパティが作成され、メモリから割り当てを解除するときにそれらを削除するため、同じ値をtwoViewControllerに取得することはできません。

class twoViewController: RootViewController { 
var amIaccessible: Bool = false 

override func viewDidLoad() { 
    super.viewDidLoad() 
    print(super.amIaccessible) // it will always gives you false 
} 

}

0

私はその後、私はそれらの静的ようにする必要があり、他のviewcontrollersでRootViewController変数にアクセスするには、それを考え出した:RootViewController.amIaccessible

として親クラスの

import UIKit 
class RootViewController: UIViewController { 
    static var amIaccessible: Bool = false // make this static 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 
} 

アクセスamIaccessible

import UIKit 
class oneViewController: RootViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     RootViewController.amIaccessible = true // I have initialized this variable of RootViewController 
    } 
} 

import UIKit 
class twoViewController: RootViewController { 
    var amIaccessible: Bool = false 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     print(RootViewController.amIaccessible) // it is printing true now 
    } 
}