QAMenuCatalog 0.6.0

QAMenuCatalog 0.6.0

Hans Seiffert 维护。



  • Hans Seiffert

QAMenu

CocoaPods compatible License Platform Language: Swift 5 iOS: 10.0+ codecov

你是否曾想过快速

  • 在测试您的应用程序时访问内部调试信息?
  • 在您的应用程序中提供内部快捷方式,例如重置通常不可访问的状态?
  • 曝光可用的功能开关并覆盖它们?
  • 测试您的崩溃报告器是否仍然有效?
  • ...

如果是,那么您就不必再为所需的编码工作、UI 代码、视图模型等而担心。

QAMenu 可以帮助您。它是一个减少的数据模型驱动的布局渲染器,专为 QAMenus、调试菜单和设置屏幕的用法而定制,这些屏幕未交付给最终用户,而仅供内部使用。与系统设置包不同,它直接存在于您的应用程序中,并且是交互式的。您可以直接获取信息和执行操作。

您可以将其视为您的调试菜单设计系统。

QAMenu 随附一个小型目录,其中包含一些非常通用的模型,例如显示应用程序版本、公开 Info.plist 内容或执行崩溃。尽管其主要重点是为您提供框架,以便在您日常生活中的某个时刻添加自定义调试信息/操作(以最小的努力,并且不一定要触摸 UI 代码)。

介绍到此结束。这个展示给了您一个预告。您所看到的是 QAMenu 实例。示例中显示的一切都是基于(几乎)无 UI 数据模型结构的。

Screenshot of showcase example Animated gif of showcase example

您可以通过在 Examples/Example-iOS 中运行示例应用程序并选择展示菜单来亲自尝试。

愿景

QAMenu 基于以下愿景

您的应用中的调试功能应该是团队工作流程的有机部分。而不是依赖于临时修补方法来劫持现有的UI元素,它们应该是可永久访问的,并使整个团队能够访问,同时开发人员应该能够敏捷地添加更多,而不必担心没有足够的时间来完成。

在此基础上,以下是一些原则。

有关每个原则的详细描述,请见原则

使用方法

QAMenu以独立窗口的形式展示。可以通过调用show()方法或摇晃设备来打开。

配置可以在应用启动时完成。要创建QA菜单,需要传递菜单结构。大多数数据模型类型都包封为Dynamic<T>,它可以持有普通值、闭包或关键路径。当需要时,QAMenu及其UI渲染器才会解包内容。这使得实现实时行为成为可能。

通常QAMenu可以存储并初始化在应用代理中。

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

  // You need to keep a reference to QAMenu, otherwise it will be released from memory
  var qaMenu: QAMenu?

  ...
  
  private func setupQAMenu() {
   let groups: [Group] = [
      QAMenu.Catalog.AppInfo.group(),
      self.cacheGroup,
      QAMenu.Catalog.Preferences.group()
    ]
    self.qaMenu = QAMenu(
      pane: RootPane(title: .static("Simple Project"), groups: groups),
      presenterType: QAMenuUIKitPresenter.self
    )
    self.qaMenu?.setTrigger([.shake], mode: .initialValue)
  }
  
  private var cacheGroup: [Group] {
    let group = ItemGroup(title: .static("App Cache"), items: .static([
      BoolItem(
        title: .static("Enable cache"),
        value: .computed({ [weak self] in
            return self?.simpleProjectCacheEnabled ?? false
        }),
        onValueChange: { [weak self] value, _, result in
            guard let self = self else {
              result(.failure("Object was released from memory"))
              return
            }
            self.simpleProjectCacheEnabled = value
            result(.success)
        }
      ),
      StringItem(
        title: .static("Cached images"),
        value: .computed({ [weak self] in
          return String(describing: self?.cache.imagesCount ?? 0)
        })
      ),
      ButtonItem(
        title: .static("Reset image cache"),
        action: { [weak self] (item: ButtonItem, _) in
          item.status = .progress("Deleting cache")
          DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
            self?.simpleProjectCachedImagesCount = 0
            item.status = .idle
            item.parentGroup?.invalidate()
          }
        }
      )
    ]))
    return group
  }
}

此截图显示了生成的QAMenu。您还可以找到并使用位于Examples/Example-iOS中的示例应用中的代码。

开发路线图

支持的数据类型 - 布局

  • 面板(即屏幕/视图控制器)
  • 嵌套面板(即子面板)
  • 选择器组

支持的数据类型 - 项目

  • 字符串(可编辑)
  • 按钮
  • 布尔值(可编辑)
  • 页脚
  • 选择字符串
  • 进度项
  • 步进器项
  • 滑动器项

能力

  • 长按项目以共享
  • 面板中的搜索
  • 项、组和面板的无效化(重新加载)
  • 在组中动态添加/删除项
  • 编辑字符串(单行)
  • 编辑字符串(多行)
  • 异步加载操作(项)
  • 异步加载操作(组)
  • 触发项和组上的对话框的接口

有关更多详情,请见数据结构

渲染器

  • UIKit(优化iPhone)
  • UIKit(优化iPad)
  • SwiftUI(优化iPhone)
  • SwiftUI(优化iPad)

测试

  • 单元测试
  • UI测试
  • UI快照测试

CI

  • 在提交请求中运行单元测试
  • 在提交请求中编译示例应用
  • 在提交请求中执行代码审查
  • 在提交请求中运行UI测试

文档

  • README
  • 源代码中的文档
  • 具有更多详细集成和公共API描述的Wiki

QAMenu 目录

QAMenu 提供了一个独立的框架 QAMenuCatalog,其中包含一些非常基本的调试项。它作为使用示例和可重复使用的配置,用于这些非常基本的项。

一些示例截图

请参阅 目录 和示例应用程序以获取更多详细信息。

安装

CocoaPods

CocoaPods 是 Cocoa 项目的依赖管理器。您可以使用以下命令安装它

$ gem install cocoapods

要使用 CocoaPods 将 QAMenu 集成到您的 Xcode 项目中,请在您的 Podfile 中指定它

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '10.0'
use_frameworks!

target '<Your Target Name>' do
    pod 'QAMenuUIKit'
end

然后,运行以下命令

$ pod install

手工集成

要从源代码直接集成 QAMenu,请遵循常规集成步骤。您可以使用 Examples/Example-iOS 作为实际示例。