Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 正在从Firebase获取用户名:在展开可选值时意外发现nil_Swift_Firebase_Firebase Realtime Database - Fatal编程技术网

Swift 正在从Firebase获取用户名:在展开可选值时意外发现nil

Swift 正在从Firebase获取用户名:在展开可选值时意外发现nil,swift,firebase,firebase-realtime-database,Swift,Firebase,Firebase Realtime Database,我试图显示将图像发布到homeViewController的用户的用户名,但用户名打印为nil。我想我在代码中遗漏了一些重要的东西,但不确定是什么 我得到以下错误: 线程1:致命错误:在展开文件时意外发现nil 可选值 在HomeViewController中的loadPosts()函数中的第行: self.fetchUser(uid: post.uid!, completed: { HomeViewController: class HomeViewController: UIViewCon

我试图显示将图像发布到homeViewController的用户的用户名,但用户名打印为nil。我想我在代码中遗漏了一些重要的东西,但不确定是什么

我得到以下错误:

线程1:致命错误:在展开文件时意外发现nil 可选值

在HomeViewController中的loadPosts()函数中的第行:

self.fetchUser(uid: post.uid!, completed: {
HomeViewController:

class HomeViewController: UIViewController {

    @IBOutlet var popover: UIView!
    @IBOutlet weak var imageView: UIImageView!

    @IBOutlet weak var popoverUsername: UILabel!


    @IBOutlet weak var tableView: UITableView!
    var posts = [Post]()
    var users = [User]()

    var postId: String!

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.estimatedRowHeight = 417
        tableView.rowHeight = UITableViewAutomaticDimension
        tableView.dataSource = self

        loadPosts()
        self.popover.layer.cornerRadius = 20


    }
    @IBAction func dismiss_Popover(_ sender: Any) {

//        dismiss(animated: true, completion: nil)
        self.dismiss(animated: true, completion: nil)
//        dismiss(animated: true, completion: nil)
//        popoverPresentationController?.delegate?.popoverPresentationControllerDidDismissPopover?(popoverPresentationController!)

    }

    @IBAction func popoverOpen_TouchUpInside(_ sender: Any) {
    self.view.addSubview(popover)
        popover.center = self.view.center

    }

    func loadPosts() {
        Api.Post.observePosts { (post) in
            self.fetchUser(uid: post.uid!, completed: {
            self.posts.insert(post, at: 0)
            self.tableView.reloadData()
            })
        }
    }

        func fetchUser(uid: String, completed:  @escaping () -> Void ) {
            Api.User.observeUser(withId: uid, completion: {
                user in
                self.users.append(user)
                completed()
            })
        }

    @IBAction func logout_TouchUpInside(_ sender: Any) {
        do {
            try Auth.auth().signOut()
        } catch let logoutError {
            print(logoutError)
        }
        dismiss(animated: true, completion: nil)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "SiteSegue" {
            let siteVC = segue.destination as! SiteViewController
            let postId = sender as! String
            siteVC.postId = postId

        }
    }
}

extension HomeViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return posts.count
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "PostCell", for: indexPath) as! HomeTableViewCell
        let post = posts[indexPath.row]
        let user = users[indexPath.row]
        cell.user = user
        cell.post = post
        cell.delegate = self
        return cell
    }
}



extension HomeViewController: HomeTableViewCellDelegate {
    func goToSiteVC(postId: String) {
        performSegue(withIdentifier: "SiteSegue", sender: postId)
    }
}
HomeTableViewCell:

class HomeTableViewCell: UITableViewCell {

    @IBOutlet weak var profileImageView: UIImageView!
    @IBOutlet weak var siteImageView: UIImageView!
    @IBOutlet weak var siteTitleLabel: UILabel!
    @IBOutlet weak var usernameLabel: UILabel!
    @IBOutlet weak var dateLabel: UILabel!


    var delegate: HomeTableViewCellDelegate?

    var post: Post? {
        didSet {
            updateView()
        }
    }

    var user: User? {
        didSet {
            setupUserInfo()
        }
    }

    func updateView() {
        siteTitleLabel.text = post?.caption
        dateLabel.text = post?.pickerTextField
        }


    func setupUserInfo() {
        usernameLabel.text = user?.username
        if let photoUrlString = user?.profileImageUrl {
            let photoUrl = URL(string: photoUrlString)
            profileImageView.sd_setImage(with: photoUrl, placeholderImage: UIImage(named: "placeholderImg"))

        }
    }
    override func awakeFromNib() {
        super.awakeFromNib()
        usernameLabel.text = ""
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.siteImageView_TouchUpInside))
        siteImageView.addGestureRecognizer(tapGesture)
        siteImageView.isUserInteractionEnabled = true
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

    @objc func siteImageView_TouchUpInside() {
        if let id = post?.id {
            delegate?.goToSiteVC(postId: id)
        }
    }

    override func prepareForReuse() {
        super.prepareForReuse()
        profileImageView.image = UIImage(named: "placeholderImg")
    }

}
用户API:

class UserApi {
    var REF_USERS = Database.database().reference().child("users")

    func observeUser(withId uid: String, completion: @escaping (User) -> Void) {
        REF_USERS.child(uid).observeSingleEvent(of: .value, with: {
            snapshot in
            if let dict = snapshot.value as? [String: Any] {
                let user = User.transformUser(dict: dict, key: snapshot.key)
                completion(user)
            }
        })
    }

}

在哪一行??@zombie在HomeViewController的loadPosts()函数中,在以下行上:self.fetchUser(uid:post.uid!,已完成:{put
guard let userId=post.uid else{print(“userId为nil或may be-post为nil”)返回}
在这一行的上方
self.fetchUser(uid:post.uid!,已完成:{
@Kamran It崩溃并且在控制台中调用“UserId为nil或Post为nil”,现在您应该检查Post/uid为nil的原因。