我目前正在尝试根据从后端 url 获取的加载到 TableView 中的项目数使动态 UIbutton 出现和消失。如果表格 View 中加载了 12 个或更多项,我希望按钮出现,如果少于 12 个,则不显示。关于处理此问题的最佳方法有什么想法吗?
import UIKit
import RxSwift
import RxCocoa
public class AllProvidersPickerViewController: InputableTableViewController, ViewModelHolder {
@IBOutlet private(set) weak var searchBar: UISearchBar!
@IBOutlet weak var dontSeeProviderButton: UIButton!
var viewModel: AllProvidersPickerViewModel! = nil
private let bag = DisposeBag()
override public func viewDidLoad() {
super.viewDidLoad()
setupRx()
}
private func setupRx() {
viewModel.shownProviders
.bind(to: tableView.rx.items(cellIdentifier: "ProviderCell")) { _, mvpd, cell in
cell.textLabel?.text = mvpd.displayName
}
.addDisposableTo(bag)
tableView
.rx
.modelSelected(MVPD.self)
.bind(to: viewModel.selectedProvider)
.addDisposableTo(bag)
searchBar
.rx.text
.orEmpty
.bind(to: viewModel.searchQuery)
.addDisposableTo(bag)
dontSeeProviderButton
.rx.tap
.bind(to: viewModel.tappedDontSeeProvider)
.addDisposableTo(bag)
}
}
private extension MVPD {
var displayName: String {
return self.names.first ?? ""
}
}
最佳答案
XFreire 的答案很好,或者你可以这样做:
viewModel.shownProviders
.map { $0.count < 12 }
.bind(to: dontSeeProviderButton.rx.isHidden)
.disposed(by: bag)
确保shownProviders
可以处理被订阅而无需重新发送任何网络请求或其他任何东西。您可能需要 shareReplayLatestWhileConnected()
为此。
我被要求解释这段代码......我将通过分解它来做到这一点......
let shownProviders = viewModel.shownProviders
此时,我知道 shownProviders
是一个数组。我不太了解数组包含的类型,因为该信息不在问题中,但我不需要知道
let shownProviders = viewModel.shownProviders
let shouldHideButton = shownProviders.map { $0.count < 12 }
在上面一行中,我知道 $0
是一个数组,我知道如果数组中的项目少于 12 个,按钮应该隐藏。 $0.count < 12
返回一个 bool 值。 map
将转换 shownProviders
可观察到 block 返回的任何内容,所以我知道 shouldHideButton
是一个 Observable<Bool>
.
let shownProviders = viewModel.shownProviders
let shouldHideButton = shownProviders.map { $0.count < 12 }
let disposable = shouldHideButton.bind(to: dontSeeProviderButton.rx.isHidden)
上面这行代码绑定(bind)了shouldHideButton
的结果到 isHidden
按钮的属性。它返回一个一次性的。
let shownProviders = viewModel.shownProviders
let shouldHideButton = shownProviders.map { $0.count < 12 }
let disposable = shouldHideButton.bind(to: dontSeeProviderButton.rx.isHidden)
disposable.disposed(by: bag)
最后一行确保当 View Controller 超出范围时绑定(bind)将被破坏。
关于swift - 根据 TableView 中的项目数使动态 UI 按钮出现和消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43986177/