#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
того, что они не вызываются
- Вам нужно установить
UITableView.dataSource = self
вviewDidLoad
-
Вам нужно зарегистрироваться
cellview.xib
viewDidLoad
, например, так:contents.register(UINib(nibName: "cellview", bundle: nil), forCellReuseIdentifier: "Cell")
-
Опции по той причине, что они могут быть
nil
, и если это произойдет, ваше приложение выйдет из строя, избегайте принудительного развертывания опций!
, вот примерguard
инструкции с необязательной цепочкойguard err == nil, let documents = querySnapshot?.documents else { // error handling here return } self.posts = documents.map { post(name: $0.documentID) }
-
Я видел в вашем коде, с помощью
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")