我的 NSDictionary 在我的 IBAction 中变为零
Posted
技术标签:
【中文标题】我的 NSDictionary 在我的 IBAction 中变为零【英文标题】:My NSDictionary is becoming nil inside my IBAction 【发布时间】:2018-10-08 01:48:08 【问题描述】:我有一个表格视图,用于呈现用户创建的事件。当您单击其中一个时,它会将您带到显示事件详细信息的不同页面。
我正在使用 Firebase 并将 postI
D 从 tableview 传递到详细视图,并且所有信息都在 NSDictionary
中正确传递。
但是,当我尝试从viewDidLoad
和IBAction
访问NSDictionary
时,它告诉我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])
【问题讨论】:
数据从 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
PHP json_encode() 与空 NSDictionary