Панель навигации Большие заголовки сокращаются, если данные загружаются за пределы экрана через привязку источника данных Rx - PullRequest
2 голосов
/ 19 марта 2019

При использовании больших заголовков на панели навигации вместе с UITableView, который привязан к источнику данных драйвера Rx, я заметил, что если привязка и начальная загрузка данных происходят, когда представление находится за пределами экрана, при переходе к немубудет прокручиваться так, что большой заголовок будет уменьшен до «свернутого» положения.

Общая настройка - это UITableViewController с установленным prefersLargeTitles = true.Tableview настроен и впоследствии привязан к источнику данных Rx в пределах viewDidLoad.

Пример кода:

override func viewDidLoad() {
  super.viewDidLoad()
  setupTableView()
  bindToTableView()

  // ...
}

private func setupTableView() {
  tableView.register(cellType: Cell.self)
  tableView.tableFooterView = UIView()
  tableView.separatorStyle = .none

  // ...

  // We are required to first reset the data source and delegate to allow
  // for RxCocoa to take over control.
  tableView.dataSource = nil
  tableView.delegate = nil
  tableView.rx.setDelegate(self)
    .disposed(by: bag)

  // ...
}

private func bindToModel() {
  viewModel.modelDriver
    .drive(tableView.rx.items) { tableView, row, model in
      let indexPath = IndexPath(row: row, section: 0)
      let cell: Cell = tableView.dequeueReusableCell(for: indexPath)
      cell.prepare(with: model)
      return cell
    }.disposed(by: bag)
}

И под «сокращенным» я подразумеваю, что заголовки переключаются на этот стиль:

small nav title

Кто-нибудь еще сталкивался с этой проблемой?


Решено: Как @ daniel-t упоминает нижепроблема вызвана не Rx, а временем, когда prefersLargeTitles = true.Если это свойство не установлено до , то происходит вызов tableView.reloadData(), тогда таблица загрузит данные и прокрутит соответствующим образом для небольших заголовков .Затем, после установки больших заголовков, просмотр таблицы не сбрасывает позицию прокрутки, чтобы компенсировать новую, большую область панели навигации.

Причина, по которой это проявляется несколько странно, даже при использовании чего-то вроде .skipUntil(...viewWillAppear), заключается в том, чтоАкт привязки запускает начальное обновление Rx, которое перезагружает таблицу.

1 Ответ

1 голос
/ 20 марта 2019

Ваша проблема в другом месте, а не в представленном вами коде или чем-то, что связано с Rx.Следующее работает как задумано:

class ViewController: UITableViewController {

    private let bag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()

        title = "Title"
        navigationController?.navigationBar.prefersLargeTitles = true

        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
        tableView.tableFooterView = UIView()
        tableView.separatorStyle = .none
        tableView.dataSource = nil
        tableView.delegate = nil
        tableView.rx.setDelegate(self)
            .disposed(by: bag)

        let modelDriver = Driver.just(Array<String>(repeating: "Hello world", count: 30))
        modelDriver
            .drive(tableView.rx.items) { tableView, row, model in
                let indexPath = IndexPath(row: row, section: 0)
                let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
                cell.textLabel?.text = model
                return cell
            }
            .disposed(by: bag)
    }
}

Может быть, проблема связана с тем, как вы строите свои ячейки?Или, может быть, вы где-то прокручиваете список внизу?

...