Получение значения константы в другом контроллере всегда возвращает ноль, используя Swift - PullRequest
0 голосов
/ 05 декабря 2018

При попытке получить значение historyRef в другом VC он возвращает ноль.Я пробовал разные решения (включая это, которое я использую), и я не могу получить фактическое значение переменной historyRef, как объявлено в viewDidLoad ().

База данных Firebase имеет узел "history", который имеет ключ (childByAutoId ()) в MainVC.Я пытаюсь получить доступ к этому ключу в SecondVC.

В MainVC есть константа:

var historyRef : FIRDatabaseReference!
var ref : FIRDatabaseReference!

Также объявлен экземпляр:

private static let _instance = MainVC()

static var instance: MainVC {
    return _instance
}

viewDidLoad ():

historyRef = ref.child("history").childByAutoId()

SecondVC

class SecondVC: UIViewController {

    var mainVC : MainVC? = nil // hold reference

    override func viewDidLoad() {
        super.viewDidLoad()

        mainVC = MainVC() // create MainVC instance

        getUserHistoryIds()
    }

    func getUserHistoryIds() {
        let historyKey = mainVC?.historyRef
        print("HistoryKey: \(String(describing: historyKey))")
    }

}

распечатка:

HistoryKey: nil

Моя база данных:

my-app
- history
    + LSciQTJwR0VqwaAfKVz

Редактировать

Скореечем получить от другого контроллера, я получил от Firebase.

Мне удалось получить значение childAutoById, но в нем перечислены все, а не только текущий:

let historyRef = ref.child("history")
    historyRef.observe(.value) { (snapshot) in
        if snapshot.exists() {
            for history in snapshot.children {
                let snap = history as! FIRDataSnapshot
                let _ = snap.value as! [String: Any] // dict
                let historyKey = snap.key
                print("History Key: \(historyKey)")
            }

        } else {
            print("There are none")
        }
    }

Ответы [ 3 ]

0 голосов
/ 05 декабря 2018

Переместите ссылку истории из viewDidLoad в init () при инициализации MainVC.Таким образом, метод будет запущен, как только вы создадите экземпляр контроллера представления.Также убедитесь, что это не асинхронный вызов, или добавьте обратный вызов завершения, чтобы знать, когда это будет сделано, поскольку вы упоминаете, что используете firebase.

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
   historyRef = ref.child("history").childByAutoId()   
}

Когда вы создаете экземпляр MainVC, но никогда не загружаете его такэтот historyRef никогда не запустится.

Также использование контроллера представления в качестве статического не рекомендуется.Я бы предпочел передать переменную через инициализаторы или модели представления.

0 голосов
/ 06 декабря 2018

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

let historyRef = ref.child("history")
historyRef.observe(.value) { (snapshot) in
    if snapshot.exists() {
        for history in snapshot.children {
            let snap = history as! FIRDataSnapshot
            let _ = snap.value as! [String: Any] // dict
            let historyKey = snap.key
            print("History Key: \(historyKey)")
        }

    } else {
        print("There are none")
    }
}

Это получает все случайные ключиа не текущий, с которым я могу работать.

0 голосов
/ 05 декабря 2018

Вы инициализируете MainVC :: historyRef в методе viewDidLoad, но простое создание экземпляра MainVC из SecondVC не приведет к загрузке или отображению MainVC.

Вы можете использовать mainVC = MainVC.instance, но вы зависите от того, был ли ранее загружен экземпляр MainVC, и каким образом он не был удален.

Я бы хотел извлечь любые использованные модели, чтобы они не были связаны с VC и передавались в VC как часть перехода, когда они необходимы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...