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

如何在不自定义SelectorViewController的情况下刷新Eureka PushRow选项?

解决方案:无需自定义控制器即可刷新SelectorViewController

当然可以做到!不用自定义SelectorViewController的话,核心思路是直接获取当前弹出的SelectorViewController实例,更新它的选项数组并刷新列表,同时同步更新原PushRow的选项,确保下次打开时也是最新数据。

具体步骤:

  1. 添加弱引用属性保存SelectorViewController实例
    在你的表单视图控制器中,添加一个弱引用属性来持有弹出的SelectorViewController,避免循环引用:
import Eureka

class YourFormViewController: FormViewController {
    let defaults = UserDefaults.standard
    // 弱引用保存当前弹出的选择器控制器
    weak var currentLocationSelectorVC: SelectorViewController<String>?
    
    // ... 其他代码
}
  1. 在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(_:)))
    }
}
  1. 在添加新选项后刷新控制器
    修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:08:33