表单 (Forms)

SwiftPM License

Forms 提供了一系列可重用的表单组件,包括文本项、输入字段、复选框、按钮和间距元素,旨在简化将表单集成到您的 iOS 应用程序中的过程。该库专注于灵活性和易用性,使开发人员能够**轻松**创建美观且交互式表单。无论您是构建注册页面还是设置屏幕,Forms 库都能简化您的开发流程并增强您的应用程序用户体验。

安装 Forms

Swift Package Manager

要使用 Swift Package Manager 安装 Forms,您可以按照 Apple 发布的教程,使用 Forms 仓库的 URL 和当前版本。

  1. 在 Xcode 中,选择“File” → “Add Packages...”
  2. 输入 https://github.com/brunomunizaf/Forms

或者您可以将以下依赖项添加到您的 Package.swift

.package(url: "https://github.com/brunomunizaf/Forms.git", from: "0.1.5")

创建表单

您可以以编程方式实例化 FormView,或者将其用作 Storyboard 或 Xib 上的 UIView 的自定义类,并通过 @IBOutlet 连接它。

import Forms
import UIKit

final class ViewController: UIViewController {
  @IBOutlet weak var formView: FormView!

  override func viewDidLoad() {
    super.viewDidLoad()

    formView.add(
      FormTextItem(
       text: "Personal details"
    ))
}

每个 FormItem 都可以根据您的需要进行自定义。

FormTextItem(
  text: "Create a new password",
  font: UIFont(name: "Helvetica-bold", size: 35)!,
  color: .black,
  spacingAfter: 15
)

FormTextItem(
  text: "Your new password must be unique therefore different than the previously used.",
  attributes: [
    .font: UIFont(name: "Helvetica", size: 13)!,
    .foregroundColor: UIColor.gray,
    .kern: 0.1
  ],
  spacingAfter: 30
)

您还可以轻松监听 FormButtonItem 实例上的点击事件,因为它继承自 UIControl

let buttonItem = FormButtonItem(title: "Continue")
buttonItem.addTarget(self, action: #selector(didTapOnButton), for: .touchUpInside)

@objc func didTapOnButton() {
  // TODO: ...
}

对于 FormCheckboxItem,要收到状态更改的通知,请实现一个可选的闭包。

let checkboxItem = FormCheckboxItem(title: "Accept terms & conditions")
checkboxItem.didSelect = {
  // TODO: ...
}

如果您想验证文本字段中的内容,FormInputField 是完美的选择。您只需实现 didChange 闭包,以便在内容发生任何更改时收到通知。

let inputItem = FormInputItem(title: "Street Address")
inputItem.didChange = {
  // TODO: ...
}

此外,关于 FormInputItem,它遵循一个名为 FormInputType 的协议,这意味着我们可以通过简单地访问其 .value 属性来访问用户插入的值。

自定义项目

在示例项目中,您可以找到一些使用遵循 FormItem 协议的 UIView 自定义实现的示例。 您将在此处找到的大部分示例都与验证相关 - 这在诸如注册流程之类的表单中非常常见。

final class MinimumFormInputItem: FormInputItem, Validatable {
  var isValid: Bool {
    if let value {
      return !value.isEmpty
    } else {
      return false
    }
  }
}

final class RegexFormInputItem: FormInputItem, Validatable {
  var isValid: Bool {
    guard let value else { return false }

    let regexPattern = "^[0-9]+$"
    do {
      let regex = try NSRegularExpression(pattern: regexPattern)
      let range = NSRange(value.startIndex..., in: value)
      let isMatch = regex.firstMatch(in: value, options: [], range: range) != nil
      return isMatch
    } catch {
      return false
    }
  }
}

final class RequiredFormCheckboxItem: FormCheckboxItem, Validatable {
  var isValid: Bool { isSelected }
}

Validatable 协议只是为我们提供了一个 isValid 布尔属性,该属性在遵循它的任何对象上都有自己的实现。 这意味着您可以为不同的输入设置不同类型的规则。

由于有了这个协议,我们可以映射表单中的项目来验证所有项目,并执行诸如启用/禁用“继续”按钮之类的操作。

public var isValid: Bool {
  elements
    .compactMap { $0 as? Validatable }
    .allSatisfy { $0.isValid }
}

贡献

要对项目进行更改,您可以克隆存储库并打开 Package.swift

如果包含新功能或错误修复的所有拉取请求都包含验证所包含更改的单元测试用例,那就太好了。 您可以使用 FormsTests 目标来实现这一点。