Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 根据表视图中的项目数显示并取消缩放动态UIbutton_Swift_Uibutton_Rx Swift - Fatal编程技术网

Swift 根据表视图中的项目数显示并取消缩放动态UIbutton

Swift 根据表视图中的项目数显示并取消缩放动态UIbutton,swift,uibutton,rx-swift,Swift,Uibutton,Rx Swift,我目前正试图根据从后端url获取的加载到表视图中的项目数,使动态UIbutton出现和消失。如果有12个或更多项目加载到表视图中,我希望按钮显示,如果少于12个,则不显示。有什么好办法处理这个问题吗 import UIKit import RxSwift import RxCocoa public class AllProvidersPickerViewController: InputableTableViewController, ViewModelHolder { @IBOut

我目前正试图根据从后端url获取的加载到表视图中的项目数,使动态UIbutton出现和消失。如果有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 ?? ""
    }
}
最简单的方法:

viewModel.shownProviders
    .subscribe(onNext: { [weak self] items in 
        if items.count < 12 {
            self?.viewAllProvidersButton.isHidden = true
        }
        else {
            self?.viewAllProvidersButton.isHidden = false
        }
    })
    .addDisposableTo(bag)
然后在
setupRx()
中:


XFreire的答案很好,或者您可以:

viewModel.shownProviders
    .map { $0.count < 12 }
    .bind(to: dontSeeProviderButton.rx.isHidden)
    .disposed(by: bag)
此时,我知道
shownProviders
是一个数组。我不太了解数组包含的类型,因为这些信息不在问题中,但我不需要知道

let shownProviders = viewModel.shownProviders
let shouldHideButton = shownProviders.map { $0.count < 12 }
上面的代码行将
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)
让shownProviders=viewModel.shownProviders
让shoulHideButton=shownProviders.map{$0.count<12}
let disposable=shouldHideButton.bind(到:dontSeeProviderButton.rx.ishiden)
一次性。处理(通过:袋)

最后一行确保了当视图控制器超出范围时绑定将被破坏。

您真是太棒了!那绝对有效!除了我关闭了“viewAllProvidersButton”的“DontSeProviderButton”并将其全部放入setupRx()。非常感谢你的帮助。我是一个新手,仍然掌握着swift和swift rx的窍门。
.subscribe(onNext:{if items.count中的[weak self]items.count<12{self?.viewAllProvidersButton.ishiden=true}否则{self?.viewAllProvidersButton.ishiden=false}).addDisposableTo(袋子)
太好了!我正在更新答案以使用
viewAllProvidersButton
。如果答案有帮助,请将其标记为已接受好吗?:)哦,是的!我喜欢:)更优雅!是的!非常感谢你,@Daniel T。!你能用自己的话解释一下这里发生的事情背后的逻辑吗。我仍然在学习RXswift和Swift,所以我想在学习的过程中完全理解一切。
let shownProviders = viewModel.shownProviders
let shownProviders = viewModel.shownProviders
let shouldHideButton = shownProviders.map { $0.count < 12 }
let shownProviders = viewModel.shownProviders
let shouldHideButton = shownProviders.map { $0.count < 12 }
let disposable = shouldHideButton.bind(to: dontSeeProviderButton.rx.isHidden)
let shownProviders = viewModel.shownProviders
let shouldHideButton = shownProviders.map { $0.count < 12 }
let disposable = shouldHideButton.bind(to: dontSeeProviderButton.rx.isHidden)
disposable.disposed(by: bag)