将自定义Push Row迁移至Eureka 4.1的技术求助
我刚帮好几个开发者搞定过Eureka版本迁移的坑,你的场景太有代表性了!先给你拆解两个核心问题,顺便告诉你:其实不用自定义Row就能实现你要的多行标签+自定义选择器头部,先从这个省心的方案说起~
一、优先用原生能力替代自定义Row(零迁移成本)
Eureka 4.1的原生PushRow已经支持你要的所有功能,完全不用自己造轮子:
1. 实现标签多行显示
通过customCellSetup闭包直接配置cell的文本属性,一行代码搞定多行:
PushRow<String>("multiLineDemo") { row in row.title = "这是一个超长的测试标题,需要自动换行显示,测试测试测试测试测试测试测试测试" row.options = ["选项A", "选项B", "选项C"] } .customCellSetup { cell, _ in // 开启多行+自动换行 cell.textLabel?.numberOfLines = 0 cell.textLabel?.lineBreakMode = .byWordWrapping }
记得给所在的tableView设置rowHeight = UITableView.automaticDimension和estimatedRowHeight = 60,让cell高度自适应。
2. 自定义选择器VC的分区头部
利用onPresent闭包直接修改跳转后的选择器视图控制器,不管是自定义UIView还是用Eureka自带的HeaderFooterView都可以:
// 方式1:用自定义UIView做头部 .onPresent { _, selectorVC in let customHeader = UIView(frame: CGRect(x: 0, y: 0, width: selectorVC.view.frame.width, height: 60)) customHeader.backgroundColor = .systemGray5 let titleLabel = UILabel(frame: customHeader.bounds) titleLabel.text = "我的自定义头部" titleLabel.textAlignment = .center customHeader.addSubview(titleLabel) selectorVC.tableView.tableHeaderView = customHeader } // 方式2:用Eureka原生HeaderFooterView(更贴合Eureka风格) .onPresent { _, selectorVC in selectorVC.form.sections.first?.header = HeaderFooterView(title: "原生风格自定义头部") { header in header.textLabel?.textColor = .systemBlue header.textLabel?.font = .boldSystemFont(ofSize: 16) } }
二、如果必须保留自定义Push Row的迁移步骤
要是你因为历史代码原因必须保留自定义Row,Eureka 4.1的API变化不大,重点调整这几点:
1. 自定义Row的继承与配置
Eureka 4.x的Row结构基本延续3.x,但推荐用customCellSetup替代重写cellSetup(当然重写也可以):
final class MultiLinePushRow<T: Equatable>: PushRow<T> { override func customCellSetup(_ cell: UITableViewCell, row: Row) { super.customCellSetup(cell, row: row) // 开启多行显示 cell.textLabel?.numberOfLines = 0 cell.textLabel?.lineBreakMode = .byWordWrapping // 触发自适应布局 cell.setNeedsLayout() cell.layoutIfNeeded() } }
使用方式和原生PushRow完全一致,直接初始化即可。
2. 跳转逻辑的适配
Eureka 4.x弱化了segue的直接使用,推荐用onPresent或onSelect闭包处理跳转后的VC配置,和原生方案的头部配置逻辑完全一样,直接复用就行。
三、自定义选择器视图控制器的适配
如果你的选择器VC是完全自定义的(不是Eureka默认的PushSelectorViewController),Eureka 4.x支持直接替换跳转的VC:
// 替换为自定义选择器VC MultiLinePushRow<String>("customSelector") { row in row.title = "自定义选择器测试" // 指定自定义VC row.presentationMode = .presentModally(controllerProvider: .callback { let yourVC = YourCustomSelectorViewController() // 配置你的VC逻辑,比如传递选项、设置回调 yourVC.options = ["自定义选项1", "自定义选项2"] yourVC.onSelect = { selectedValue in row.value = selectedValue row.updateCell() } return yourVC }) }
只要确保你的自定义VC实现选择后的回调逻辑,更新Row的value即可。
内容的提问来源于stack exchange,提问作者Rod Schmidt

