TableView не обновляется должным образом после выхода из системы и входа в систему

#ios #swift #uitableview

#iOS #swift #uitableview

Вопрос:

У меня есть контроллер просмотра профиля, где я отображаю адрес электронной почты пользователя, который вошел в систему. Когда я выхожу и снова вхожу в систему, электронное письмо обновляется, но 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
        }
    }

}
 

Комментарии:

1. Вы не очищаете массив данных перед добавлением к нему новых данных в viewWillAppear.

2. Вы используете UserDefaults.standard.value(forKey: "email") и Auth.auth().currentUser?.email какой из них является правдой?

3. Я не использую UserDefaults.standard для tableview, потому что у него были некоторые другие проблемы, тем не менее, у меня была похожая проблема. Вы говорите, что я не очищаю массив данных перед добавлением. Как я могу это сделать?

Ответ №1:

Я думаю, вам нужно очистить массив данных перед добавлением нового объекта в этот массив. просто напишите data.removeAll() раньше data.append(ProfileViewModel(viewModelType: .info, title: "Email: (email ?? "No Email")", handler: nil)) .

Я думаю, это решит вашу проблему.

Комментарии:

1. Я буду рад помочь