这是我的代码,应该在海关tableviewcell.xib中的firebase数据库中显示用户,但是启动应用程序时,tableview保持为空,我真的不知道代码中有什么问题或缺少什么,我认为这是一个非常简单的错误,但我无法弄清楚。 预先感谢那些会回答的人。
import UIKit
import Firebase
class UsersTableView: UIViewController, UITableViewDelegate, UITableViewDataSource {
// Outlets.
@IBOutlet weak var tableview: UITableView!
// Var.
var user = [User]()
override func viewDidLoad() {
super.viewDidLoad()
retrieveUsers()
// Do any additional setup after loading the view.
}
func retrieveUsers() {
let ref = Database.database().reference()
ref.child("users").queryOrderedByKey().observeSingleEvent(of: .value, with: { DataSnapshot in
let users = DataSnapshot.value as! [String: AnyObject]
self.user.removeAll()
for (_, value) in users{
//let uid = Auth.auth().currentUser!.uid
if let uid = value["userID"] as? String{
if uid != Auth.auth().currentUser!.uid {
let userToShow = User()
if let fullName = value["username"] as? String , let imagePath = value["photoURL"] as? String {
userToShow.username = fullName
userToShow.imagePath = imagePath
userToShow.userID = uid
self.user.append(userToShow)
}
}
}
}
self.tableview.reloadData()
})
ref.removeAllObservers()
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
let cell = tableview.dequeueReusableCell(withIdentifier: "UserCell", for: indexPath) as! UserTableViewCell
cell.nameLabel.text = self.user[indexPath.row].username
cell.userID = self.user[indexPath.row].userID
cell.userImage.downloadImage(from: self.user[indexPath.row].imagePath!)
//checkFollowing(indexPath: indexPath)
return cell
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return user.count ?? 0
}
}
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()
}
}
答案 0 :(得分:1)
如果您没有在情节提要中为tableView
设置委托和数据源,请通过编程方式进行操作:
override func viewDidLoad() {
super.viewDidLoad()
//Add these 2 lines, might be missed.
self.tableview.delegate = self
self.tableview.dataSource = self
retrieveUsers()
}
答案 1 :(得分:0)
检查清单:
设置tableView委托和数据源
self.tableview.delegate =自我
self.tableview.dataSource = self
注册的自定义tableViewCell
?
let cellNIb = UINib.init(nibName:“ Identifier_Name”,捆绑包:nil) register(cellNIb,forCellReuseIdentifier:标识符)
检查func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
的返回计数
答案 2 :(得分:0)
您忘记了两件事:
将表视图的dataSource
设置为控制器。如果您不这样做,那么您的tableView
将不需要任何数据。因此,请在控制器的viewDidLoad
tableview.dataSource = self
如果您为单元格创建了自定义xib,请不要忘记为表视图注册自定义单元格(也可以在viewDidLoad
中进行操作)
tableview.register(UINib(nibName: "UserCardTableViewCell", bundle: nil), forCellReuseIdentifier: "UserCell")
如果您还需要UITableViewDelegate
之类的didSelectRowAt
方法,请不要忘记将表视图的delegate
设置为控制器
tableview.delegate = self