我的 NSDictionary 在我的 IBAction 中变为零

Posted

技术标签:

【中文标题】我的 NSDictionary 在我的 IBAction 中变为零【英文标题】:My NSDictionary is becoming nil inside my IBAction 【发布时间】:2018-10-08 01:48:08 【问题描述】:

我有一个表格视图,用于呈现用户创建的事件。当您单击其中一个时,它会将您带到显示事件详细信息的不同页面。

我正在使用 Firebase 并将 postID 从 tableview 传递到详细视图,并且所有信息都在 NSDictionary 中正确传递。

但是,当我尝试从viewDidLoadIBAction 访问NSDictionary 时,它告诉我NSDictionarynil。当我签入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])
            

        
    


【问题讨论】:

数据从 Firebase 异步加载。如果您需要某些代码中的数据,那应该(从)inside 闭包中调用。有关示例,请参见 ***.com/questions/38364288/…。 可能有点离题,但不要在 Swift 中使用NSDictionary,而是使用Dictionary 【参考方案1】:

我假设你从前一个控制器传递了 beeHive 的值,因为你还没有初始化或在任何地方得到它的值:-

尝试在 viewDidLoad 结束之前设置一个断点,以仔细检查字典是否在块中不为零

self.beehiveID = snapshot.value as? NSDictionary

尝试使用“if let”或“guard”检查快照的值是否为 nil,因为您可能只是将 nil 值分配给 NSDictionary。此外,由于您使用可选项来分配每个值,因此它不会返回异常,而只会将 nil 值分配给每个属性

试试这个并告诉我。很高兴为您提供帮助!

【讨论】:

OP 正试图在闭包之外访问 self.beehiveID?。该 var 将仅填充 inside 闭包,因此闭包之后的代码将具有 nil 值。

以上是关于我的 NSDictionary 在我的 IBAction 中变为零的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3 NSDictionary 到 Dictionary 的转换导致 NSInvalidArgumentException

无法将 json 字符串解析为 nsdictionary

在手机之间发送 NSDictionary

PHP json_encode() 与空 NSDictionary

搜索字符串是不是包含来自 Nsdictionary 的 NSArray 的任何值

将 json 解析为 NSDictionary [关闭]