SwiftUI 动态表单

swiftui-dynamic-forms

该包处于早期 alpha 阶段(原型阶段)
从终端运行以生成示例
make workspace.xcworkspace

待办事项

  • 组件
    • DynamicText
    • DynamicButton
    • DynamicStack
    • DynamicTextField
    • DynamicTextView
    • DynamicSpacer
    • DynamicImage
    • DynamicConfirmationDialog
    • DynamicAlert
    • DynamicDragField
    • DynamicDropField
  • 特征
    • 可编码支持
    • 自定义修改器
  • 待思考
    • 状态管理的 API 改进
    • 操作处理的 API 改进
    • 用于自定义视图的 API
    • 派生(可选/集合)的帮助程序Binding
    • 将目标分为目标和目标DynamicFormsDynamicFormsDynamicFormsUI

用法

  • 进口DynamicForms

  • 声明动态表单模型

    DynamicForm {
      DynamicStack(.vertical) {
        DynamicText("Title").bold()
        DynamicText("Description")
        DynamicStack(.horizontal) {
          DynamicText("State: ")
          DynamicText("Initial")
        }
        DynamicStack(.horizontal) {
          DynamicButton(
            DynamicText("OK"),
            action: "content.ok"
          )
          DynamicButton(
            DynamicText("Cancel"),
            action: "content.cancel"
          )
        }
      }
    }

    Equivalent for

    VStack {
      Text("Title").bold()
      Text("Description")
      HStack {
        Text("State: ")
        Text("Initial")
      }
      HStack {
        Button { 
          DynamicFormClient.shared.send("content.id")
        } label: {
          Text("OK")
        }
        Button { 
          DynamicFormClient.shared.send("content.cancel")
        } label: {
          Text("Cancel")
        }
      }
    }
  • Specify body for your dynamic-form-based view using DynamicFormView

    DynamicFormView($form)
  • Handle button actions

    // Returns AnyPublisher<Event, Never> where Event is
    // Event {
    //   id: DynamicElementIdentifier
    //   action: DynamicElementActionIdentifier
    // }
    DynamicFormClient.shared.publisher
    
    // Filters events and returns AnyPublisher<Void, Never>
    DynamicFormClient.shared.publisher(
      for: .init(id: "element", action: "tap")
    )
    
    // Filters events by actionID and returns AnyPublisher<Void, Never>
    DynamicFormClient.shared.publisher(
      for: "actionID"
    )

Installation

Basic

You can add DynamicForms to an Xcode project by adding it as a package dependency.

  1. From the File menu, select Swift Packages › Add Package Dependency…
  2. Enter "https://github.com/capturecontext/swiftui-dynamic-forms.git" into the package repository URL text field
  3. Choose products you need to link them to your project.

Recommended

If you use SwiftPM for your project, you can add StandardClients to your package file.

.package(
  name: "swiftui-dynamic-forms",
  url: "https://github.com/capturecontext/swiftui-dynamic-forms.git", 
  .branch("main")
)

Do not forget about target dependencies:

.product(
  name: "DynamicFormss", 
  package: "swiftui-dynamic-forms"
)

License

This library is released under the MIT license. See LICENSE for details.

GitHub

点击跳转