为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
相关产品推荐
相关产品推荐

