swift - 根据 TableView 中的项目数使动态 UI 按钮出现和消失

标签 swift uibutton rx-swift

我目前正在尝试根据从后端 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/

相关文章:

ios - rxSwift 按钮按下观察者问题

ios - 如何删除圆形 UIImageView 中的空白区域?

ios - 我怎么知道核心数据里有什么

ios - Swift 中来自字节数组的 NSData

swift - 更改顶层 tvOS 中的默认 displayAction 和 playAction 标签

swift - 在 Swift (tvOS) 中,如何更改 UIButton 的突出显示和焦点颜色?

ios - 手动居中时,UIButton 不会在 UITableViewCell 中居中

ios条件tableview单元格渲染

ios - RXswift,重复可观察直到完成

swift - RXSwift如何结合最新使用,看起来像什么,闭包中的匿名类并处理附加参数