2016-10-07 6 views
0

У меня есть главный UIViewController имени RootViewController вПочему унаследованная переменная не инициализирована в swift?

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

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

и 2 subcontrollers имени oneViewController и twoViewController наследуемых RootViewController как: (также прочитать мои комментарии)

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 :(
    } 
} 

Теперь проблема заключается в том, что My oneViewController является первоначальным видом моего приложения, а twoViewController - вторым представлением, инициализированным после первого представления, поэтому я хочу, чтобы Root ViewController - мой контроллер одноэлементного типа, который может содержать мои переменные и методы на протяжении всего жизненного цикла приложения. Как я могу это достичь?

Мне не нужно решение, как отдельный одиночный класс, я знаю, что так же, как создание общего экземпляра, который может содержать переменные во время выполнения приложения. Поэтому, пожалуйста, дайте мне решение с помощью наследования отношения

+2

Проблема с размещением переменных в контроллере представления вместо sep arate model object (что я, конечно же, рекомендую), заключается в том, что вы не контролируете жизненный цикл контроллеров представлений. iOS создает и уничтожает их по своему усмотрению, и вы ничего не можете с этим поделать. Если вы хотите сделать доступ к этому объекту singleton прозрачным, добавьте рассчитанные свойства или функции в контроллер базового представления, чтобы скрыть доступ к вашему централизованному синглтону. – dasblinkenlight

+1

У вас есть непонимание того, как работает наследование классов. 'RootViewController' не является синглом. Это просто суперкласс каждого из ваших двух других контроллеров. Каждый контроллер представления имеет свой собственный экземпляр свойств, объявленных 'RootViewController' Shanging' 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 если вы хотите получить доступ к amIaccessible собственности RootViewController вы должны использовать супер с имуществом и если вы измените значение свойства amIaccessible с oneViewController, вы не сможете получить то же значение в twoViewController, потому что для каждого объекта iOS создает новое свойство и убивает его, когда он освобождается из памяти.

class twoViewController: RootViewController { 
var amIaccessible: Bool = false 

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

}

0

Я понял это, чтобы получить доступ к RootViewController переменных в других viewcontrollers то я должен сделать их статическими, как:

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

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

доступа amIaccessible родительского класса, как RootViewController.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 
    } 
} 
Смежные вопросы