Мой NSDictionary становится нулевым внутри моего IBAction - PullRequest
0 голосов
/ 08 октября 2018

У меня есть таблица, в которой представлены события, которые создает пользователь.Когда вы нажимаете на одну из них, вы переходите на другую страницу, на которой представлены подробности события.

Я использую Firebase и передаю postI D из табличного вида в подробный вид, и вся информация правильно передается в NSDictionary.

Однако, когда я пытаюсь получить доступ к NSDictionary из viewDidLoad и в IBAction, он говорит мне, что NSDictionary - это nil.Когда я регистрирую viewDidLoad, это не nil.

Я очень новичок в программировании и обучении, но я застрял на этом некоторое время и понятия не имею, чтонеправильно или как я могу это исправить

это мой код

import UIKit
import Firebase

class BeehiveViewViewController: UIViewController {



    @IBOutlet weak var eventImage: UIImageView!
    @IBOutlet weak var eventName: UILabel!
    @IBOutlet weak var location: UILabel!
    @IBOutlet weak var eventDate: UILabel!
    @IBOutlet weak var eventHost: UILabel!
    @IBOutlet weak var members: UILabel!
    @IBOutlet weak var joinButton: roundButton!


    var beehiveID: NSDictionary?
    var ref = Database.database().reference()


    override func viewDidLoad() {
        super.viewDidLoad()

        view.setGradientBackground(colourOne: primaryColor, colourTwo: secondaryColor)

        let uid = Auth.auth().currentUser?.uid
        ref.child("users").child(uid!).child(self.beehiveID?["pid"] as! String).observe(.value) { (snapshot) in

            let uid = self.beehiveID!["pid"] as! String
            self.beehiveID = snapshot.value as? NSDictionary
            self.beehiveID?.setValue(uid, forKey: "pid")
    }

        let imageURL = self.beehiveID!["imageDownloadURL"] as! String

        let url = URL(string: imageURL)
        DispatchQueue.global(qos: .background).async {

            let data = NSData(contentsOf: url!)
            DispatchQueue.main.async {

            self.eventImage.image = UIImage(data: data! as Data)



            }
        }

        self.eventName.text = self.beehiveID?["eventName"] as? String
        self.eventDate.text = self.beehiveID?["eventDate"] as? String
        self.eventHost.text = self.beehiveID?["beehiveHost"] as? String
        self.location.text = self.beehiveID?["location"] as? String

        let uidd = Auth.auth().currentUser?.uid
        Database.database().reference().child("users").child(uidd!).child("Posts").child(self.beehiveID?["pid"] as! String).child("Members").observe(.value) { (snapshot) in

            let memberCount = snapshot.childrenCount
            self.members.text = "\(memberCount)"
        }

        let userID = Auth.auth().currentUser?.uid
        Database.database().reference().child("users").child(userID!).child("Posts").child(self.beehiveID?["pid"] as! String).observe(.value) { (snapshot) in

            print(snapshot)

            if (snapshot.exists()){

                self.joinButton.setTitle("Remove Beehive", for: .normal)
            }

            else{

                self.joinButton.setTitle("Join Beehive", for: .normal)
            }
        }



}

    @IBAction func buttonPressed(_ sender: Any) {

        if joinButton.titleLabel?.text == "Remove Beehive"{

            let uid = Auth.auth().currentUser?.uid
            let dbref = ref.child("users").child(uid!).child("Posts").child(beehiveID?["pid"] as! String)

//error is the line above that beehiveID?["pid"] is nil

            dbref.removeValue()


            navigationController?.popViewController(animated: true)

        }

        if joinButton.titleLabel?.text == "Join Beehive"{

            let uid = Auth.auth().currentUser?.uid
            let dbref = Database.database().reference().child("users").child(uid!).child("Posts").child("Members")
            Database.database().reference().child("users").child(uid!).child("Name").observe(.value) { (nameSnapshot) in
                let memberName = nameSnapshot.value as! String
                let userObject = [memberName: uid]
                dbref.updateChildValues(userObject as! [AnyHashable : String])
            }

        }
    }

}

1 Ответ

0 голосов
/ 08 октября 2018

Я предполагаю, что вы передаете значение beeHive от предыдущего контроллера, поскольку вы нигде не инициализировали или не получили его значения: -

Попробуйте установить точку останова прямо перед концом viewDidLoad, чтобы удвоить-проверьте, не является ли словарь ноль в блоке

self.beehiveID = snapshot.value as? NSDictionary

Попробуйте использовать проверку, чтобы увидеть, имеет ли значение снимка значение ноль, используя 'if let' или 'guard', поскольку вы могли бы просто назначить нользначение для NSDictionary.Кроме того, поскольку вы используете необязательные значения для присваивания каждого значения, оно не возвращает исключение, а просто продолжает присваивать значение nil каждому свойству

. Попробуйте и дайте мне знать.Рад помочь!

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