You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为RxPickerViewAttributedStringAdapter添加Done按钮(RxSwift实现)

为UIPickerView添加Done按钮(RxSwift实现)

步骤1:创建带Done按钮的工具栏

在View代码中,构建一个包含Done按钮的UIToolbar,并将其设置为文本框的输入辅助视图:

// 初始化工具栏
let toolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 44))
toolbar.barStyle = .default

// 创建Done按钮和弹性占位项
let doneButton = UIBarButtonItem(title: "Done", style: .done, target: nil, action: nil)
let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)

// 配置工具栏项目布局
toolbar.items = [flexibleSpace, doneButton]

// 绑定到文本框的输入辅助视图
self.genderField?.inputAccessoryView = toolbar

步骤2:用RxSwift处理Done按钮点击

通过RxSwift订阅Done按钮的点击事件,触发键盘收起(同时隐藏PickerView):

doneButton.rx.tap
    .subscribe(onNext: { [weak self] in
        self?.genderField?.resignFirstResponder()
    })
    .disposed(by: bag)

步骤3:同步PickerView选择到ViewModel(可选但推荐)

确保PickerView的选中项能同步到ViewModel的gender属性,添加绑定逻辑:

if let genderSource = castedViewModel.genderSource {
    castedViewModel
        .gender
        .bind(to: genderPicker.rx.items(adapter: genderSource))
        .disposed(by: bag)
    
    // 订阅PickerView选择事件,更新ViewModel
    genderPicker.rx.itemSelected
        .subscribe(onNext: { [weak self] row, component in
            guard let self = self, let selectedOption = self.castedViewModel.genderDetail.value[row] else { return }
            self.castedViewModel.gender.accept(selectedOption)
        })
        .disposed(by: bag)
}

self.genderField?.inputView = genderPicker

完整整合后的View代码

// 配置PickerView与ViewModel的绑定
if let genderSource = castedViewModel.genderSource {
    castedViewModel
        .gender
        .bind(to: genderPicker.rx.items(adapter: genderSource))
        .disposed(by: bag)
    
    // 同步选择项到ViewModel
    genderPicker.rx.itemSelected
        .subscribe(onNext: { [weak self] row, component in
            guard let self = self, let selectedOption = self.castedViewModel.genderDetail.value[row] else { return }
            self.castedViewModel.gender.accept(selectedOption)
        })
        .disposed(by: bag)
}

// 创建带Done按钮的工具栏
let toolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 44))
toolbar.barStyle = .default

let doneButton = UIBarButtonItem(title: "Done", style: .done, target: nil, action: nil)
let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)

toolbar.items = [flexibleSpace, doneButton]
self.genderField?.inputAccessoryView = toolbar

// RxSwift处理Done按钮点击
doneButton.rx.tap
    .subscribe(onNext: { [weak self] in
        self?.genderField?.resignFirstResponder()
    })
    .disposed(by: bag)

// 设置PickerView为文本框的输入视图
self.genderField?.inputView = genderPicker

内容的提问来源于stack exchange,提问作者yselimguner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 15:08:27