如何在不自定义SelectorViewController的情况下刷新Eureka PushRow选项?
解决方案:无需自定义控制器即可刷新SelectorViewController
当然可以做到!不用自定义SelectorViewController的话,核心思路是直接获取当前弹出的SelectorViewController实例,更新它的选项数组并刷新列表,同时同步更新原PushRow的选项,确保下次打开时也是最新数据。
具体步骤:
- 添加弱引用属性保存SelectorViewController实例
在你的表单视图控制器中,添加一个弱引用属性来持有弹出的SelectorViewController,避免循环引用:
import Eureka class YourFormViewController: FormViewController { let defaults = UserDefaults.standard // 弱引用保存当前弹出的选择器控制器 weak var currentLocationSelectorVC: SelectorViewController<String>? // ... 其他代码 }
- 在onPresent中绑定控制器实例
修改setupForm()里的onPresent闭包,把弹出的SelectorViewController赋值给刚才的属性:
func setupForm() { form +++ PushRow<String>(K.SESSIONFIELD.location) { $0.title = K.SESSIONFIELD.location $0.options = defaults.array(forKey: K.SESSIONFIELD.location) as? [String] ?? [] $0.value = sessionResult?.sessionLocation ?? $0.options?.first } .onPresent { from, to in // 保存选择器控制器实例 self.currentLocationSelectorVC = to as? SelectorViewController<String> // 添加右侧导航按钮 to.navigationItem.rightBarButtonItem = UIBarButtonItem(image: UIImage(named:"add_20pt"), style: .plain, target: from, action: #selector(self.locationSelectorAddButton(_:))) } }
- 在添加新选项后刷新控制器
修改locationSelectorAddButton中的alert action,添加刷新逻辑:
@objc func locationSelectorAddButton(_ sender: UIBarButtonItem) { var textField = UITextField() let alert = UIAlertController(title: "Add New Location", message: "", preferredStyle: .alert) let addAction = UIAlertAction(title: "Add", style: .default) { [weak self] action in guard let self = self, let newLocation = textField.text, !newLocation.trimmingCharacters(in: .whitespaces).isEmpty else { return // 空内容不添加 } // 更新UserDefaults中的数组 var locationArray = self.defaults.array(forKey: K.SESSIONFIELD.location) as? [String] ?? [] locationArray.append(newLocation) self.defaults.set(locationArray, forKey: K.SESSIONFIELD.location) // 1. 刷新当前弹出的SelectorViewController if let selectorVC = self.currentLocationSelectorVC { selectorVC.options = locationArray selectorVC.tableView.reloadData() } // 2. 更新原PushRow的选项,确保下次打开时显示最新数据 if let pushRow = self.form.rowBy(tag: K.SESSIONFIELD.location) as? PushRow<String> { pushRow.options = locationArray } } alert.addTextField { alertTextField in alertTextField.placeholder = "Location name ..." textField = alertTextField } alert.addAction(addAction) alert.addAction(UIAlertAction(title: "Cancel", style: .cancel)) // 增加取消按钮更友好 present(alert, animated: true) }
关键说明:
- 使用弱引用保存SelectorViewController,避免视图控制器被pop后仍持有引用导致内存泄漏。
- 同时更新SelectorViewController的
options和原PushRow的options,保证即时刷新和后续打开的正确性。 - 增加了空内容判断,避免添加空的位置选项,提升代码健壮性。
这样就能在不自定义SelectorViewController的前提下,实现添加新选项后立即刷新弹出的选择列表啦!
内容的提问来源于stack exchange,提问作者Clueless G
相关产品推荐
相关产品推荐

