我有一个UITableView
,它需要显示从数据库(异步)下载的消息。可能没有任何消息,所以我想显示一个静态文本,明确指出。问题在于,在将数据下载并缓存到数组中之后,放置在UILabel
上的tableView.backgroundView
仍然存在。我不知道为什么。这是我的代码:
@IBOutlet weak var tableView: UITableView!
var messages = [Message]()
var users = [UserModel]()
override func viewDidLoad() {
super.viewDidLoad()
loadMessages()
}
// All of these are called Async
func loadMessages() {
guard let userUid = Api.Users.CURRENT_USER?.uid else { return }
Api.Message.observeUsersMessagesForUser(withId: userUid) { messageKey in
Api.Message.observeMessage(with: messageKey, completion: { message in
self.fetchUsers(userId: message.to!, completion: {
self.messages.append(message)
DispatchQueue.main.async {
self.tableView.reloadData()
}
})
})
}
}
func fetchUsers(userId: String, completion: @escaping () -> Void) {
Api.Users.observeUsersShort { user in
self.users.append(user)
completion()
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if messages.isEmpty {
showNoDataTableView()
return 0
}
else {
return messages.count
}
}
func showNoDataTableView() {
// self.activityIndicator.stopAnimating()
if messages.isEmpty {
let noDataLabel: UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width,
height: self.tableView.bounds.size.height))
noDataLabel.numberOfLines = 0
noDataLabel.text = "No messages yet :( \r\n\n Don't be afraid to start a conversation."
noDataLabel.textColor = Theme.current.label_noData_textColor
noDataLabel.font = Theme.current.label_noData_font
noDataLabel.textAlignment = .center
tableView.backgroundView = noDataLabel
tableView.backgroundView?.backgroundColor = Theme.current.tableView_backgroundView_backgroundColor
tableView.separatorStyle = .none
}
}
答案 0 :(得分:2)
首先不要将showNoDataTableView()
放在numberOfRowsInSection
中。只需返回通常的
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return messages.count
}
并将showNoDataTableView()
放在loadMessages()
的分派异步关闭中
DispatchQueue.main.async {
self.tableView.reloadData()
showNoDataTableView()
}
在showNoDataTableView()
中,您必须检查
messages
为空并且标签不存在(尚未),请创建标签。messages
为不为空并且标签存在存在,请删除标签。在其他两种情况下什么也不做。
func showNoDataTableView() {
// self.activityIndicator.stopAnimating()
if messages.isEmpty && tableView.backgroundView == nil {
let noDataLabel: UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width,
height: self.tableView.bounds.size.height))
noDataLabel.numberOfLines = 0
noDataLabel.text = "No messages yet :( \r\n\n Don't be afraid to start a conversation."
noDataLabel.textColor = Theme.current.label_noData_textColor
noDataLabel.font = Theme.current.label_noData_font
noDataLabel.textAlignment = .center
tableView.backgroundView = noDataLabel
tableView.backgroundView?.backgroundColor = Theme.current.tableView_backgroundView_backgroundColor
tableView.separatorStyle = .none
} else if !messages.isEmpty && tableView.backgroundView != nil {
tableView.backgroundView = nil
tableView.separatorStyle = // set default style
}
}