簡體   English   中英

為什么我在使用該值時得到一個 nil 值,但是當我打印它時它顯示為 none nil?

[英]Why am I getting a nil value when I go to use the value but when I print it it shows up as none nil?

我正在嘗試填充集合視圖。 當我在字典中使用一個值時,它顯示為 nil,但是當我在它為我提供字符串之前打印它時。

我之前解決了這個問題,但是當我重新創建我的集合視圖以解決我遇到的另一個錯誤時,這個錯誤又回來了。 為了修復它,我只是刪除了 self.users.removeAll() 行。 這次重新添加該行然后刪除它不起作用。

我在此功能中遇到了具體問題:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionview.dequeueReusableCell(withReuseIdentifier: "userCell", for: indexPath) as! UserCell

    print(user[indexPath.row].imagePath!)

    cell.userImage.sd_setImage(with: URL(string: user[indexPath.row].imagePath!))

    cell.nameLabel.text = user[indexPath.row].username
    cell.userID = user[indexPath.row].userID

    return cell
}

這是完整的代碼:

import UIKit
import Firebase
import SwiftKeychainWrapper
import SwiftUI
import FirebaseUI

class UserViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {

    @IBOutlet weak var collectionview: UICollectionView!

    var user = [User]()

    override func viewDidLoad() {
        super.viewDidLoad()
        collectionview.delegate = self
        collectionview.dataSource = self

        retrieveUsers()
    }

    func retrieveUsers() {
       let ref = Database.database().reference()
       ref.child("users/").observeSingleEvent(of:.value, with: { (snapshot) in
          let users = snapshot.value as! [String : NSDictionary]
          //self.user.removeAll()
          for (_, value) in users {
             if let uid = value["uid"] as? String {
                if uid != Auth.auth().currentUser!.uid {
                   let userToShow = User()
                   if let username = value["username"] as? String, let imagePath = value["urlToImage"] as? String {
                      userToShow.username = username
                      userToShow.imagePath = imagePath
                      userToShow.userID = uid
                      self.user.append(userToShow)
                      print(userToShow)
                   }
                }
             }
          }

          self.collectionview.reloadData()
       })

       ref.removeAllObservers()
    }

    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionview.dequeueReusableCell(withReuseIdentifier: "userCell", for: indexPath) as! UserCell

        print(user[indexPath.row].imagePath!)

        cell.userImage.sd_setImage(with: URL(string: user[indexPath.row].imagePath!))
        cell.nameLabel.text = user[indexPath.row].username
        cell.userID = user[indexPath.row].userID

        return cell
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return user.count //?? 0
    }

    func checkFollowing(indexPath: IndexPath) {
       let uid = Auth.auth().currentUser!.uid
       let ref = Database.database().reference()

       ref.child("users").child(uid).child("following").queryOrderedByKey().observeSingleEvent(of: .value, with: { snapshot in
           if let following = snapshot.value as? [String : AnyObject] {
              for (_, value) in following {
                 if value as! String == self.user[indexPath.row].userID {
//                  self.tableview.cellForRow(at: indexPath)?.accessoryType = .checkmark
                 }
              }
           }
       })

       ref.removeAllObservers()

    }

    @IBAction func logOutPressed(_ sender: Any) {
        KeychainWrapper.standard.removeObject(forKey:"uid")

        do {
            try Auth.auth().signOut()
        } catch let signOutError as NSError{
            print("Error signing out: %@", signOutError)
        }
        dismiss(animated: true, completion: nil)
    }
}


extension UIImageView {
    func downloadImage(from imgURL: String!) {
        let url = URLRequest(url: URL(string: imgURL)!)

        let task = URLSession.shared.dataTask(with: url) {  (data, response, error) in
            if error != nil {
                print(error!)
                return
            }

            DispatchQueue.main.async {
                self.image = UIImage(data: data!)
            }
        }

        task.resume()
    }
}

我沒有正確填充字典嗎?

此外,這里是 User 類:

import UIKit

class User: NSObject {
    var userID: String?
    var username: String?
    var imagePath: String?
}

此外,這是用戶字典在調試器中顯示的內容:

在此處輸入圖片說明

如果您遇到此錯誤,請重做與您的集合視圖單元格的連接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM