Swift 4中pickerWheel.adjust无法匹配值‘Mai 4’的问题求助
解决Picker Wheel调整时的断言失败问题
我之前也踩过这个Picker Wheel字符串匹配的坑,给你几个实用的解决思路:
1. 用实际显示的字符串进行匹配
系统的adjust(toPickerWheelValue:)方法是严格精确匹配字符串的,哪怕内容一样但格式(比如顺序、标点、空格)不对,就会触发断言失败。你可以先获取Picker上实际显示的所有可选值,再用这个值去调用adjust方法:
let targetPicker = app.pickerWheels.firstMatch // 获取Picker的所有可选值列表 let allDisplayedValues = targetPicker.values.allElements.map { $0.label } // 根据你的需求筛选目标值(比如要找包含"Mai"和"1"的项) if let targetValue = allDisplayedValues.first(where: { $0.contains("Mai") && $0.contains("1") }) { targetPicker.adjust(toPickerWheelValue: targetValue) } else { // 处理找不到的情况 XCTFail("目标值未在Picker中找到") }
这个方法的核心是用Picker实际渲染的字符串去调用,避免格式不匹配的问题。
2. 通过索引定位而非字符串
如果字符串匹配始终有问题,可以直接通过索引来调整Picker。先找到目标值对应的索引,再用该索引对应的字符串去调整:
let targetPicker = app.pickerWheels.firstMatch let allValues = targetPicker.values.allElements.map { $0.label } // 假设你要找的是第1项(索引0),或者根据内容找索引 guard let targetIndex = allValues.firstIndex(where: { $0.hasSuffix("Mai") }) else { XCTFail("未找到目标索引") return } targetPicker.adjust(toPickerWheelValue: allValues[targetIndex])
3. 模拟滑动操作绕过字符串匹配
如果以上方法都不行,还可以直接模拟滑动来定位到目标位置。Picker每一项的高度通常是固定的(比如44pt),你可以计算滑动偏移量:
let targetPicker = app.pickerWheels.firstMatch // 假设每一项高度为44pt,根据你的App实际情况调整 let itemHeight: CGFloat = 44 // 滑动到第3项(索引2),向上滑是往索引小的方向,向下滑反之 targetPicker.swipeUp(velocity: .slow, offset: itemHeight * 2)
额外排查点
- 检查测试环境的本地化设置:如果你的App支持多语言,Picker的日期格式可能会随系统语言变化,确保测试代码的语言和运行环境一致。
- 确认Picker的数据源格式:如果是你自己开发的App,检查数据源输出的字符串格式和Picker显示的是否完全一致,比如是"1. Mai"还是"Mai 1"。
内容的提问来源于stack exchange,提问作者Godlike
相关产品推荐
相关产品推荐

