QAMenu
您是否曾经希望快速
- 在测试您应用程序时访问内部调试信息?
- 在您应用程序中提供内部快捷方式,例如重置通常无法访问的状态?
- 显示可用的功能开关并覆盖它们?
- 测试您的崩溃报告器是否仍然工作?
- ...
很好,在这种情况下,您无需再担心所需的编码工作、UI 代码、视图模型等。
QAMenu 就在这里帮助您。它是一个简化数据模型驱动的布局渲染器,专门用于 QAMenu、调试菜单和设置屏幕,这些内容不会发送给最终用户,而只供内部使用。与系统设置包不同,它直接存在于您的应用程序中,并且是交互式的。您可以直接检索信息和执行操作。
您可以将其视为您调试菜单的设计系统。
QAMenu 附带一个小型目录,其中包含一些非常通用的模型,例如显示应用程序版本、公开 Info.plist 内容或执行崩溃。不过,其主要重点是为您提供一个框架,当您在日常生活中需要添加自定义调试信息/操作时,可以以最少的努力实现 - 不必触动 UI 代码(如果非必要)。
介绍完毕。这个展示向您提供了一个预览。您所看到的是一个 QAMenu 实例。在示例中显示的所有内容都是基于(几乎)无界面数据模型结构。
您可以通过在 Examples/Example-iOS
中运行示例应用程序并选择展示菜单来亲自尝试。
愿景
QAMenu 基于以下愿景
您的应用程序的调试功能应该是团队工作流程的有机组成部分。不应依赖于本地篡改现有UI元素的临时解决方案,而应使其对整个团队永久可用,开发者应始终能够快速添加更多功能,而不必担心没有足够的时间。
从这一愿景出发,以下是以下原则。
查看原则以了解每个原则的详细说明。
使用方法
QAMenu以独立窗口的形式呈现。可以通过调用方法show()
或摇晃设备来打开。
配置可以在应用程序启动期间完成。要创建QA菜单,需要传递菜单结构。与委托相比,大多数数据模型类型都作为Dynamic<T>
装箱,可以存储原始值、闭包或键路径。QAMenu及其UI渲染器仅在需要时才解包内容。这实现了实时行为。
通常,可以在App Delegate中存储和初始化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
- 在PR中运行单元测试
- 在PR中编译示例应用程序
- 在PR中进行lint
- 在PR中运行UI测试
文档
- README
- 源代码中的文档
- 包含更多详细集成和公共API描述的维基
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
作为现实示例使用。