微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

注销并登录后,TableView 未正确更新

如何解决注销并登录后,TableView 未正确更新

我有一个 ProfileView 控制器,我在其中显示登录用户的电子邮件。当我注销并再次登录时,电子邮件会更新,但新信息时不会更新 tableview。即使完成,重新加载也只是将重复的行附加到视图中。下面是我的代码。有人可以检查我可能做错了什么

import UIKit
import FirebaseAuth
import SDWebImage
import FirebaseDatabase
final class ProfileViewController: UIViewController {

    @IBOutlet var tableView: UITableView!

    var data = [Profileviewmodel]()

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        guard let email = Auth.auth().currentUser?.email! else {
          return
        }
        
        tableView.register(ProfileTableViewCell.self,forCellReuseIdentifier: ProfileTableViewCell.identifier)
        data.append(Profileviewmodel(viewmodelType: .info,title: "Email: \(email ??  "No Email")",handler: nil))
      
        tableView.register(UITableViewCell.self,forCellReuseIdentifier: "cell")
        tableView.delegate = self
        tableView.dataSource = self
        tableView.tableHeaderView = createTableHeader()
       
       
       
    }
   

    func createTableHeader() -> UIView? {
        guard let email = UserDefaults.standard.value(forKey: "email") as? String else {
            return nil
        }

        let safeEmail = DatabaseManager.safeEmail(emailAddress: email)
        let filename = safeEmail + "_profile_picture.png"
        let path = "images/"+filename

        let headerView = UIView(frame: CGRect(x: 0,y: 0,width: self.view.width,height: 300))

        headerView.backgroundColor = .link

        let imageView = UIImageView(frame: CGRect(x: (headerView.width-150) / 2,y: 75,width: 150,height: 150))
        imageView.contentMode = .scaleAspectFill
        imageView.backgroundColor = .white
        imageView.layer.borderColor = UIColor.white.cgColor
        imageView.layer.borderWidth = 3
        imageView.layer.masksToBounds = true
        imageView.layer.cornerRadius = imageView.width/2
        headerView.addSubview(imageView)

        StorageManager.shared.downloadURL(for: path,completion: { result in
            switch result {
            case .success(let url):
                imageView.sd_setimage(with: url,completed: nil)
            case .failure(let error):
                print("Failed to get download url: \(error)")
            }
        })

        return headerView
    }

}

extension ProfileViewController: UITableViewDelegate,UITableViewDataSource {
    func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let viewmodel = data[indexPath.row]
        let cell = tableView.dequeueReusableCell(withIdentifier: ProfileTableViewCell.identifier,for: indexPath) as! ProfileTableViewCell
        cell.setUp(with: viewmodel)
        return cell
    }

    func tableView(_ tableView: UITableView,didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath,animated: true)
        data[indexPath.row].handler?()
    }
}

class ProfileTableViewCell: UITableViewCell {

    static let identifier = "ProfileTableViewCell"

    public func setUp(with viewmodel: Profileviewmodel) {
        self.textLabel?.text = viewmodel.title
        switch viewmodel.viewmodelType {
        case .info:
            textLabel?.textAlignment = .center
            selectionStyle = .none
        }
    }

}

解决方法

我认为您需要先清空数据数组,然后再将新对象添加到该数组中。 写就好了 data.removeAll() 之前 data.append(ProfileViewModel(viewModelType: .info,title: "Email: \(email ?? "No Email")",handler: nil))

我认为这将解决您的问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。