компоненты в моей ячейке tableview не видны

#ios #swift #firebase #tableview

#iOS #swift #firebase #просмотр таблицы

Вопрос:

Я создаю табличное представление, содержащее только кнопку с разными метками.

Я использую табличное представление для представления списка кнопок.

это структура, содержащая имена кнопок.

 struct post {
   let name : String
} 
  

Я перенес данные из firebase в structure post.

 var posts = [post]()
override func viewDidLoad() {
       super.viewDidLoad()
        let db = Firestore.firestore()
        db.collection(Auth.auth().currentUser?.uid as Any as! String).getDocuments() { (querySnapshot, err) in
            if let err = err {
                print("Error getting documents: (err)")
            } else {
                for document in querySnapshot!.documents {
                   // print("(document.documentID) => (document.data())")
                    self.posts.insert(post(name: document.documentID), at: 0)
                }
                self.contents.reloadData()
            }
        }
    }
  

это обычные функции табличного представления

 public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
       return posts.count
    }
    public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! cellview
        cell.programnames.titleLabel?.text = posts[indexPath.row].name
        return cell
    }
  

cellview.swift разработан следующим образом

 class cellview: UITableViewCell {


    @IBOutlet weak var programnames: UIButton!
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

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

        // Configure the view for the selected state
    }
  

Пожалуйста, скажите мне, в чем моя ошибка. Кнопка «имена программ» не отображается в табличном представлении в симуляторе

Комментарии:

1. @AamirR но метка кнопки не изменена, и видна только одна строка.

Ответ №1:

Я вижу, что отсутствует пара вещей, которые могут быть причиной UITableViewDataSource того, что они не вызываются

  1. Вам нужно установить UITableView.dataSource = self в viewDidLoad
  2. Вам нужно зарегистрироваться cellview.xib viewDidLoad , например, так:

     contents.register(UINib(nibName: "cellview", bundle: nil), forCellReuseIdentifier: "Cell")
      
  3. Опции по той причине, что они могут быть nil , и если это произойдет, ваше приложение выйдет из строя, избегайте принудительного развертывания опций ! , вот пример guard инструкции с необязательной цепочкой

     guard err == nil, let documents = querySnapshot?.documents else {
        // error handling here
        return
    }
    
    self.posts = documents.map { post(name: $0.documentID) }
      
  4. Я видел в вашем коде, с помощью posts.insert(..., at: 0) которого будет изменен массив, если вместо этого он будет использовать следующее:

     self.posts = documents.map({ post(name: $0.documentID) }).reversed()
      

Комментарии:

1. Вы добавляете document.documentID в массив posts , можете ли вы распечатать его, что он содержит print(document.documentID)

2. Я это сделал, указав название документов в базе данных firebase. @AamirR

3. является ли синтаксис для изменения метки кнопок из outlet правильным или нет. @AamirR

4. Пожалуйста, обратите внимание на эту строку contents.register(UINib(nibName: "cellview", bundle: nil), forCellReuseIdentifier: "Cell")