reloadData tableView 不调用 cellForRowAtIndexPath

问题描述 投票:0回答:1

我有一个带有 tableView 的 viewController 来显示我的模型列表,但我不知道为什么 reloadData 没有无缘无故地调用 cellForRowAtIndexPath!我在 viewDidload() 中实现了表视图数据源和委托,我确定我的表视图与我的 VC 连接,numberOfRowsInSection 也返回正确的值

这是我的代码:

protocol UserListDisplayLogic: AnyObject {
    func displayUserList(viewModel: FetchUserList.ViewModel)
}

class UserListViewController: UIViewController {
    
    // MARK: IBOutlets
    @IBOutlet weak var tableView: UITableView!
    
    // MARK: Properties
    var interactor: UserListBusinessLogic?
    var router: UserListRouting?
    var userList: [DisplayedUserListProtocol]?
    
    // MARK: LifeCycle
    override func viewDidLoad() {
        super.viewDidLoad()
        setUpView()
        interactor?.getUserList()
    }
    
    // MARK: SetUp View
    private func setUpView() {
        setUpTableView()
    }
    
    private func setUpTableView() {
        tableView.dataSource = self
        tableView.delegate = self
        tableView.separatorStyle = .none
        tableView.register(UINib(nibName: userListTableViewCell, bundle: nil), forCellReuseIdentifier: userListTableViewCell)
    }
    
}

// MARK: TableViewDelegate && TableViewDataSource
extension UserListViewController: UITableViewDelegate, UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return userList?.count ?? 0
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: userListTableViewCell, for: indexPath) as! UserListTableViewCell
        cell.config(viewModel: userList?[indexPath.row])
        return cell
    }
}

// MARK: UserListDisplayLogic
extension UserListViewController: UserListDisplayLogic {
    func displayUserList(viewModel: FetchUserList.ViewModel) {
        userList = viewModel.displayedUserList
        tableView.reloadData()
    }
}

ios swift uitableview uikit
1个回答
0
投票

cellForRowAt 方法未被调用的问题可能与空的 userList 或缺少的 userList 对象有关

在 numberOfRowsInSection 方法中,您返回 userList?.count ?? 0. ??如果 userList 为 nil,运算符提供默认值 0,因此如果 userList 为空或 nil,numberOfRowsInSection 方法将返回 0。

如果 userList 为空或 nil,则不会调用 cellForRowAt 方法,因为没有要显示的行。要确认这是否是问题所在,您可以在 numberOfRowsInSection 方法中添加一条打印语句,以检查该方法是否实际被调用以及 userList?.count 的值是否符合您的预期:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    print("numberOfRowsInSection called with count: \(userList?.count ?? 0)")
    return userList?.count ?? 0
}

如果 userList?.count 的值为 0 或 nil,那么在调用 UserListDisplayLogic 扩展的 displayUserList 方法中的 tableView.reloadData() 之前,您需要确保 userList 属性已正确填充数据。

更新

如果正在调用 cellForRowAt 方法但单元格未正确显示,则在“cell.config(viewModel: userList?[indexPath.row])”行上设置断点并使用 View Debugger 可以帮助识别任何问题电池设计。

要使用 View Debugger,您可以按照以下步骤操作:

  1. 在 Xcode 中运行您的应用程序并导航到具有表视图的视图。
  2. 应用程序运行后,转到 Xcode 菜单并选择“调试”>“查看调试”>“捕获视图层次结构”。
  3. Xcode 然后将显示视图层次结构的 3D 表示。您可以选择层次结构中的任何视图以查看其属性和约束。
  4. 通过选择表格视图并导航到正确的部分和行,找到与您感兴趣的 indexPath 对应的单元格。
  5. 选择单元格后,您可以检查其属性和约束以查看是否有任何不正确或缺失的内容。
  6. 您还可以使用 3D 视图右下角的“调试视图层次结构”按钮来突出显示可能导致布局问题的任何约束。

更新

另一种可能性是 tableView 没有在主线程上重新加载。您可以尝试将 reloadData() 方法调用包装在 DispatchQueue.main.async 块中,以确保它在主线程上被调用,如下所示:

DispatchQueue.main.async {
    self.tableView.reloadData()
}
© www.soinside.com 2019 - 2024. All rights reserved.