ComboPicker 是一个 SwiftUI 视图,允许用户通过从预定义的集合中选择或键入自定义值来输入值。
ComboPicker 可通过 Swift Package Manager 获取。
.package(url: "https://github.com/MrAsterisco/ComboPicker", from: "<see GitHub releases>")
要查找最新版本,请查看此存储库的 Releases 选项卡。
ComboPicker 可以显示任何符合 ComboPickerModel
协议的类型。 以下示例展示了一个包装 Int
的模型
public struct ExampleModel: ComboPickerModel {
public static func ==(lhs: ExampleModel, rhs: ExampleModel) -> Bool {
lhs.value == rhs.value
}
public let id = UUID()
public let value: Int
// Default initializer.
public init(value: Int) {
self.value = value
}
// Initializer to convert user input into a value.
public init?(customValue: String) {
guard let doubleValue = NumberFormatter().number(from: customValue)?.intValue else { return nil }
self.init(value: doubleValue)
}
// Convert the value to prefill the manual input field.
public var valueForManualInput: String? {
NumberFormatter().string(from: .init(value: value))
}
}
您还必须提供 ValueFormatterType
的实现,以便 ComboPicker
知道如何在 Picker
中表示值。以下示例说明了上述模型的简单格式化程序
final class ExampleModelFormatter: ValueFormatterType {
func string(from value: ExampleModel) -> String {
"# \(NumberFormatter().string(from: .init(value: value.value)) ?? "")"
}
}
一旦您有了模型集合和格式化程序实现,构建 ComboPicker
就很容易了
@State private var content: [ExampleModel]
@State private var selection: ExampleModel
ComboPicker(
title: "Pick a number",
manualTitle: "Custom...",
valueFormatter: ExampleModelFormatter(),
content: $content,
value: $selection
)
ComboPicker
适配不同的平台,无论使用何种设备,都能提供简单易用的体验。
在 iOS 和 iPadOS 上,ComboPicker
显示一个单行的 UIPickerView
,用户可以滚动它。 如果用户点击它,将出现一个用于手动输入的文本字段。
如果需要,您可以自定义手动输入字段的键盘类型
.keyboardType(.numberPad)
注意:由于 SwiftUI Picker
在手势处理以及在同一屏幕上显示和使用多个滚轮选择器方面的限制,ComboPicker
目前依赖于 UIPickerView
的 UIViewRepresentable
实现。 您可以在此处阅读更多关于当前限制的信息。
在 watchOS 上,ComboPicker
显示一个普通的 Picker
,用户可以使用手指或数字表冠滚动它。 如果用户点击它,将出现一个用于手动输入的文本字段。
目前不支持指定键盘类型,因为 Apple 没有提供在 watchOS 上执行此操作的方法。
在 macOS 上,ComboPicker
变成一个 NSComboBox
。 用户将能够选择选项或直接在组件中键入自定义选项。
有关组合框如何工作的更多信息,请参阅 Apple 文档。
在 tvOS 上,ComboPicker
显示一个 Picker
,后跟一个 TextField
。 用户可以移动选择器或向下滚动到文本字段并输入自定义值。
如果需要,您可以自定义手动输入字段的键盘类型
.keyboardType(.numberPad)
ComboPicker 需要 iOS 15.0 或更高版本、macOS 12.0 或更高版本、watchOS 8.0 或更高版本和 tvOS 15.0 或更高版本。
欢迎所有为扩展库做出的贡献。 Fork 这个 repo,进行你想要的更改,然后打开一个 Pull Request。
如果您对代码库进行更改,我不会强制执行编码风格,但我可能会要求您根据库其余部分的代码风格进行更改。
这个库正在 积极开发中。 即使大多数 API 都非常简单明了,它们将来也可能会更改; 但您不必担心,因为版本发布将遵循 语义化版本 2.0.0。
ComboPicker 在 MIT 许可证下分发。 有关详细信息,请参阅 LICENSE。