ios - tableView 不刷新

标签 ios swift firebase tableview

我是编程新手,目前正在构建一个应用程序,我从 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/

相关文章:

javascript - Firebase 获取特定 key

Android - Firebase 动态 Facebook 按钮

java - 在 Android 中测试时使用不同的 `google-services.json`

c# - 使用手机时需要从网站推荐手机应用商店链接

ios - 如何从嵌入在该 Controller 容器中的 uiviewcontroller 调用存储在父 uiviewcontroller 中的方法?

objective-c - 如何从 Swift 指定与 Objective-C 中定义的接口(interface)同名的协议(protocol)

ios - 快速设置 NSDate 0 秒

ios 8完成 block 未调用

ios - 如果我执行执行验证的 setXXX 方法会发生什么?

swift - 包装到没有特定泛型类型的函数中时不调用正确的方法