Ячейки не заполняются с использованием UITableViewDiffableDataSource в UIViewController

Мой код работал до того, как я изменил подкласс с UITableViewController на UIViewController.

Причина переключения в том, что мне нужно добавить collectionView поверх моего tableView.

Но сейчас клетки не заселяются. Моментальный снимок все еще вызывается, и в массиве пользователей есть его содержимое.

Не уверен, почему переход на UIViewController заставил ячейки перестать заполняться.

      import UIKit

private let reuseIdentifier = "UserCell"

private typealias UserDataSource = UITableViewDiffableDataSource<SearchController.Section, User>
private typealias UsersSnapshot = NSDiffableDataSourceSnapshot<SearchController.Section, User>

class SearchController: UIViewController {

    // MARK: - Properties
  
    private var tableView = UITableView()

    private var users = [User]()

    private var filteredUsers = [User]()

    private let searchController = UISearchController(searchResultsController: nil)

    private var inSearchMode: Bool {
        return searchController.isActive && !searchController.searchBar.text!.isEmpty
    }

    private var dataSource: UserDataSource!

    // MARK: - Lifecycle

    override func viewDidLoad() {
        super.viewDidLoad()
        configureSearchController()
        configureTableView()
        configureDataSource()
        fetchUsers()
    }

    // MARK: - API

    private func fetchUsers() {
        showLoader(true)
        UserService.fetchUsers { [weak self] users in
            self?.showLoader(false)
            self?.users = users
            self?.createSnapshot(from: users)
        }
    }

    // MARK: - Helpers

    private func configureTableView() {
        view.backgroundColor = .white
        tableView.register(UserCell.self, forCellReuseIdentifier: reuseIdentifier)
        tableView.rowHeight = 64
    }

    private func configureDataSource() {
        dataSource = UserDataSource(tableView: tableView, cellProvider: { (tableView, indexPath, user) -> UITableViewCell? in
            guard let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier, for: indexPath) as? UserCell else { fatalError() }
            let user = self.inSearchMode ? self.filteredUsers[indexPath.row] : self.users[indexPath.row]
            cell.viewModel = UserCellViewModel(user: user)
            return cell
        })
    }

    private func configureSearchController() {
        searchController.searchResultsUpdater = self
        searchController.obscuresBackgroundDuringPresentation = false
        searchController.hidesNavigationBarDuringPresentation = false
        searchController.searchBar.placeholder = "Search"
        navigationItem.searchController = searchController
        definesPresentationContext = false
    }

    private func createSnapshot(from users: [User]) {
        var snapshot = UsersSnapshot()
        snapshot.appendSections([.main])
        snapshot.appendItems(users)
        self.dataSource.apply(snapshot, animatingDifferences: false)
    }
}


// MARK: - UITableViewDelegate

extension SearchController {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        guard let nonFilteredUser = dataSource.itemIdentifier(for: indexPath) else { return }
        let user = inSearchMode ? self.filteredUsers[indexPath.row] : nonFilteredUser
        let controller = ProfileController(user: user)
        navigationController?.pushViewController(controller, animated: true)
    }
}

// MARK: - UISearchResultsUpdating

extension SearchController: UISearchResultsUpdating {
    func updateSearchResults(for searchController: UISearchController) {
        guard let searchText = searchController.searchBar.text?.lowercased() else { return }

        filteredUsers = users.filter({$0.username.lowercased().contains(searchText)
                        || $0.fullname.lowercased().contains(searchText) })

        let users = searchText.isEmpty ? self.users : filteredUsers

        self.createSnapshot(from: users)
    }
}

// MARK: - Sections

extension SearchController {
    fileprivate enum Section {
        case main
    }
}

1 ответ

Табличное представление на самом деле не было добавлено во фрейм, поэтому на самом деле нет tableView в иерархии представлений, когда я переключился на подкласс UIViewController. Я добавляю это в viewDidLoad, и теперь он виден.

Забыл, что UIViewController не добавляет автоматически tableView в представление, например подкласс UITableViewController.

          // MARK: - Lifecycle

    override func viewDidLoad() {
        super.viewDidLoad()
        configureSearchController()
        configureTableView()
        configureDataSource()
        fetchUsers()
    
        view.addSubview(tableView) // What I've missed to add.
        tableView.frame = view.bounds
    }
Другие вопросы по тегам