#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. Я буду рад помочь