ComboPicker

ComboPicker 是一个 SwiftUI 视图,允许用户通过从预定义的集合中选择或键入自定义值来输入值。

ComboPicker

安装

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

在 iOS 和 iPadOS 上,ComboPicker 显示一个单行的 UIPickerView,用户可以滚动它。 如果用户点击它,将出现一个用于手动输入的文本字段。

ComboPicker

如果需要,您可以自定义手动输入字段的键盘类型

.keyboardType(.numberPad)

注意:由于 SwiftUI Picker 在手势处理以及在同一屏幕上显示和使用多个滚轮选择器方面的限制,ComboPicker 目前依赖于 UIPickerViewUIViewRepresentable 实现。 您可以在此处阅读更多关于当前限制的信息。

watchOS

在 watchOS 上,ComboPicker 显示一个普通的 Picker,用户可以使用手指或数字表冠滚动它。 如果用户点击它,将出现一个用于手动输入的文本字段。

ComboPicker

目前不支持指定键盘类型,因为 Apple 没有提供在 watchOS 上执行此操作的方法。

macOS

在 macOS 上,ComboPicker 变成一个 NSComboBox。 用户将能够选择选项或直接在组件中键入自定义选项。

有关组合框如何工作的更多信息,请参阅 Apple 文档

tvOS

在 tvOS 上,ComboPicker 显示一个 Picker,后跟一个 TextField。 用户可以移动选择器或向下滚动到文本字段并输入自定义值。

ComboPicker

如果需要,您可以自定义手动输入字段的键盘类型

.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