我是编程新手,目前正在构建一个应用程序,我从 Firebase 收集数据。
我认为当 View 被拉下时实现这个刷新动画会很好。现在我的问题是什么都没有刷新(一开始工作正常)。此外,每次应用程序启动时,tableView 最初都是空的,当您进行下推时,它会重新加载,但错误。
我真的很挣扎。谁能看出我的代码有什么问题吗?
class ViewController: BaseViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet var newsfeedTableView: UITableView!
@IBOutlet weak var activityIndicatorView: UIActivityIndicatorView!
private let refreshControl = UIRefreshControl()
var ref: DatabaseReference!
var posts = [String]()
var timeRef = [String]()
var userRef = [String]()
override func viewDidLoad() {
super.viewDidLoad()
addSlideMenuButton()
setupTableView()
ref = Database.database().reference()
ref.child("posts").observe( .childAdded, with: { snapshot in
let newPost = snapshot.value as? NSDictionary
let post_title:String = newPost!["post_title"] as? String ?? "error"
let newPostTime = snapshot.value as? NSDictionary
let post_time:String = newPostTime!["post_time"] as? String ?? "error collecting timestamp"
let newPostUser = snapshot.value as? NSDictionary
let post_user:String = newPostUser!["post_user"] as? String ?? "Team"
self.posts.insert(post_title, at: 0)
self.timeRef.insert(post_time, at: 0)
self.userRef.insert(post_user, at: 0)
self.newsfeedTableView.reloadData()
})
}
private func setupTableView() {
if #available(iOS 10.0, *) {
newsfeedTableView.refreshControl = refreshControl
} else {
newsfeedTableView.addSubview(refreshControl)
}
refreshControl.addTarget(self, action: #selector(refreshNewsFeedTableView(_:)), for: .valueChanged)
}
@objc private func refreshNewsFeedTableView(_ sender: Any) {
//self.refreshControl.beginRefreshing()
self.newsfeedTableView.reloadData()
self.refreshControl.endRefreshing()
self.activityIndicatorView.stopAnimating()
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return posts.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! NewsfeedCell
cell.customTextLabel?.text = posts[indexPath.row]
cell.customTimeLabel?.text = timeRef[indexPath.row]
cell.customNameLabel?.text = userRef[indexPath.row]
return cell
}
}
class NewsfeedCell: UITableViewCell {
@IBOutlet weak var customTextLabel: UILabel!
@IBOutlet weak var customNameLabel: UILabel!
@IBOutlet weak var customTimeLabel: UILabel!
}
最佳答案
这里
@objc private func refreshNewsFeedTableView(_ sender: Any)
你没有做任何 API 请求来获取数据然后重新加载表并结束刷新,并且因为你在这里使用观察
ref.child("posts").observe( .childAdded, with: { snapshot in
然后你会得到任何新数据,如果你需要实现刷新然后将所有数据库代码插入一个函数并将 observe
替换为 observeSingleEvent
并从中调用它viewDidLoad
和刷新选择器方法
ref.child("posts").observeSingleEvent( .value, with: { snapshot in
请注意,使用建议的方法,您将一次获得所有子项,因此不要忘记在 observeSingleEvent
的回调中清理数组以避免重复值,还可以考虑制作一个 dataSource 数组共 3 个
self.posts.insert(post_title, at: 0)
self.timeRef.insert(post_time, at: 0)
self.userRef.insert(post_user, at: 0)
可能与创建模型有关
struct Item {
let post:String
let time:String
let user:String
}
关于ios - tableView 不刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53670106/