gpt4 book ai didi

ios - 如果通过 Rx 数据源绑定(bind)在屏幕外加载数据,则导航栏大标题会缩小

转载 作者:可可西里 更新时间:2023-11-01 01:50:00 25 4
gpt4 key购买 nike

当在导航栏中使用大标题以及绑定(bind)到 Rx 驱动程序数据源的 UITableView 时,我注意到如果绑定(bind)和初始数据加载发生在 View 处于屏幕外时,当您导航到该 View 时将滚动,使大标题缩小到“最小化”位置。

整体设置是一个 UITableViewController,设置了 prefersLargeTitles = true。 Tableview 已设置并随后绑定(bind)到 viewDidLoad 中的 Rx 数据源。

示例代码:

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() 之前未设置此属性,则表格将加载数据并适当滚动非大标题。然后在设置大标题后,tableview 不会重置它的滚动位置以补偿新的、更大的导航栏区域。

即使在使用类似 .skipUntil(...viewWillAppear) 的情况下,这也有些奇怪的原因是因为绑定(bind)操作会触发初始 Rx 更新,从而重新加载 tableview。

最佳答案

您的问题在别处,而不是您提供的代码或与 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)
}
}

也许问题与您构建细胞的方式有关?或者,也许您正在滚动到列表底部的某处?

关于ios - 如果通过 Rx 数据源绑定(bind)在屏幕外加载数据,则导航栏大标题会缩小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55244235/

25 4 0
文章推荐: javascript - AngularJS 指令 : put a call function in an attribute, 不包含另一个属性
文章推荐: java - 控制每次迭代的操作数 JMH
文章推荐: javascript - 拖放 : How to get the URL of image being dropped if image is a link (not the url of the link)
文章推荐: java - Spark 类型不匹配 : cannot convert from JavaRDD to JavaRDD