Swift4:如何获取其他类枚举内容及实现带PickerView的传参跳转
我来帮你搞定这两个Swift开发的问题哈~
问题1:Swift4中如何获取另一个类中定义的枚举内容?
其实核心看枚举的访问级别和定义位置,分两种情况:
- 如果枚举是嵌套在目标类内部,且和当前类在同一模块(比如同一个项目/Target里),直接通过「类名.枚举名.枚举值」的方式访问就好。举个实际例子:
假设你有个工具类OrderManager,里面定义了处理订单的枚举:
class OrderManager { enum OrderStatus { case pending, processing, completed, cancelled } }
那在其他类里直接这么调用:
let currentStatus = OrderManager.OrderStatus.processing
- 如果需要跨模块访问(比如你用了第三方库的类,或者自己的多个Target),只要把枚举的访问级别改成
public(如果需要被继承就用open)就行:
class OrderManager { public enum OrderStatus { case pending, processing, completed, cancelled } }
这样在其他模块里同样可以用OrderManager.OrderStatus.completed来访问枚举值。
要是枚举是定义在类的extension里,用法也是完全一样的,只要访问级别允许就行~
问题2:根据传入的tipo参数配置通用PickerViewController
这个需求的核心是把参数传递到目标VC,再根据参数动态生成PickerView的数据源,我给你一步步拆解实现:
第一步:在目标VC(ViewControllerSelect)里准备接收参数和配置Picker
首先要在ViewControllerSelect里定义接收tipo的属性,同时实现PickerView的代理和数据源方法,根据tipo加载对应内容:
class ViewControllerSelect: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate { // 定义接收传入的tipo参数(这里假设tipo是你自定义的枚举,比如叫TipoOption) var tipo: TipoOption! // 存储PickerView的数据源 private var pickerOptions: [String] = [] // 假设你已经通过Storyboard关联了PickerView的IBOutlet @IBOutlet weak var customPickerView: UIPickerView! override func viewDidLoad() { super.viewDidLoad() // 设置PickerView的代理和数据源 customPickerView.dataSource = self customPickerView.delegate = self // 根据传入的tipo加载对应的选项 setupPickerData() } // 根据tipo动态生成Picker选项 private func setupPickerData() { switch tipo { case .entrega: pickerOptions = ["当日送达", "次日达", "预约配送"] case .retirada: pickerOptions = ["门店自提", "快递柜取件"] case .pagamento: pickerOptions = ["微信支付", "支付宝", "银行卡"] // 记得处理枚举的所有case,避免编译警告 default: pickerOptions = ["暂无选项"] } } // MARK: - UIPickerView数据源方法 func numberOfComponents(in pickerView: UIPickerView) -> Int { // 单列Picker,返回1 return 1 } func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return pickerOptions.count } // MARK: - UIPickerView代理方法 func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return pickerOptions[row] } }
第二步:在MainViewController里完善跳转逻辑,传递tipo参数
把你原有的跳转方法优化一下,避免强制解包崩溃,然后传入tipo参数:
@objc func handlerSelectOpTipo(_ sender: UILabel) { // 用guard let代替强制解包,更安全 guard let vcSelectTipo = storyboard?.instantiateViewController(withIdentifier: "ViewControllerSelect") as? ViewControllerSelect else { print("无法实例化ViewControllerSelect") return } // 传入你需要的tipo值,比如这里的.entrega vcSelectTipo.tipo = .entrega // 如果是导航控制器,用push跳转 navigationController?.pushViewController(vcSelectTipo, animated: true) // 如果是模态跳转,用下面这句 // present(vcSelectTipo, animated: true) }
额外提醒:
- 确保你的
TipoOption枚举是在两个类都能访问到的位置定义的(比如单独创建一个枚举文件,或者放在公共的工具类里) - 如果
tipo是字符串/整数类型,只要修改setupPickerData里的判断逻辑就行,核心思路不变
内容的提问来源于stack exchange,提问作者Augusto
相关产品推荐
相关产品推荐

