iOS Controller Factory
ControllerFactory
Purpose of the iOS 在您的应用中嵌入调试视图是一个节省大量时间的出色工具,但构建起来也可能非常耗时。
ControllerFactory是一个框架,目的是尽量简单快捷地从您的应用中实例化任何 UIViewController
,尽可能快速和方便。
此框架将利用运行时环境检索您应用中所有视图控制器列表的完整列表,并允许您选择在屏幕上显示哪个控制器。此外,它还包含自定义选项,例如提供初始数据。
要求
- iOS 8.0+
- Xcode 9.0+
- Swift 4.1+
安装
CocoaPods
将以下内容添加到您的 Podfile
pod "ControllerFactory"
Carthage
将以下内容添加到您的 Cartfile
github "worldline/ControllerFactory"
《ControllerFactory》如何帮助您节省时间
假设您想调整您的应用,以充分利用令人惊叹的iPhone X显示屏。
步骤 1 - 调整并测试您的应用的首页。检查。
步骤 2 - 接着,调整并测试您的设置的视图控制器。简单。
但接下来,您需要再次调整并测试注册流程中的第三个控制器,这是第11次。您需要再次走完整个注册流程。也许您会作弊一下,为什么不在首页创建一个便捷按钮,直接加载此控制器。这是可以接受的...
但是,您愿意为剩下35个控制器这样做吗?
恐怕您不会。这就是ControllerFactory
脱颖而出的时候。
《ControllerFactory》是如何工作的?
ControllerFactory
为您提供了一个调试视图,它会自动检索并列出您的所有视图控制器
然后,您只需选择要实例化的视图控制器,并选择是为了“推入”(push)还是以模态(modal)形式“展示”(present)。
现在,您只需两次点击即可在屏幕上显示所有视图控制器
限制
目前,ControllerFactory
无法
- 处理从 UIStoryboard 实例化的控制器,无需编写代码(见下面);
- 同时从多个包中检索控制器。
用法
导入
// Objective C
@import ControllerFactory;
// Swift
import ControllerFactory
显示调试视图
要实例化调试视图,可以使用以下任何一种方法
// Objective C
[ControllerFactory instantiate];
[ControllerFactory instantiateWithBundle:(NSBundle * _Nonnull)];
[ControllerFactory instantiateWithExcludedViewControllers:(NSArray<NSString *> * _Nonnull)];
[ControllerFactory instantiateWithBundle:(NSBundle * _Nonnull) excludedViewControllers:(NSArray<NSString *> * _Nonnull)];
// Swift
ControllerFactory.instantiate()
ControllerFactory.instantiate(bundle: Bundle)
ControllerFactory.instantiate(excludedViewControllers: [String])
ControllerFactory.instantiate(bundle: Bundle, excludedViewControllers: [String])
基本方法将显示您主包中的所有视图控制器。
如果您需要,也可以指定不同的包,并且/或者排除一些特定的视图控制器(例如,抽象类)。
排除特定的视图控制器
为了排除一些特定的视图控制器,首先打印出从控制器检索到的所有控制器列表到控制台
// Objective C
[ControllerFactory printControllers];
[ControllerFactory printControllersWithBundle:(NSBundle * _Nonnull)];
// Swift
ControllerFactory.printControllers()
ControllerFactory.printControllers(bundle: Bundle)
就像之前一样,第一个方法将打印出您主包中的所有视图控制器,而第二个方法允许您打印出另一个包中的所有视图控制器。
然后,您需要使用打印出的值来填写excludedViewControllers
数组。
设置初始数据
到目前为止,我们使用了调试视图,通过使用它们的默认初始化器来实例化控制器。虽然这对于简单的控制器来说是可行的,但它不允许您提供一些初始数据。
为此,您可以实现以下协议
// Swift
@objc public protocol ControllerFactoryCompliant {
func prepareForControllerFactory()
}
在控制器实例化并在其显示之前,将调用 prepareForControllerFactory()
方法,因此这是设置一些初始数据的一个完美的地方。
处理具有多个用例的控制器
如果你的控制器实现多个用例,或者处理多个数据集,你可以通过协议 ControllerFactoryCompliant
将它们传递过去。
// Swift
@objc public protocol ControllerFactoryUseCaseCompliant {
static func getUseCases() -> [String]
func prepareForControllerFactory(useCase: String)
}
getUseCases()
方法允许你列出你的用例。
在初始化后,将调用 prepareForControllerFactory(useCase: String)
方法,因此你应该在这里设置你的数据或切换到特定用例。
然后调试视图将呈现不同的用例,允许你选择你需要的一个。
自定义初始化器
如果你的视图控制器没有使用默认初始化器,尝试实例化它将导致你的应用崩溃。为了解决这个问题,你需要实现以下协议
// Swift
@objc public protocol ControllerFactoryInstantiable {
static func initForControllerFactory() -> UIViewController
}
在 initForControllerFactory()
中,你可以使用你自定义的初始化器,设置所有必需的数据,然后返回控制器。
带用例的自定义初始化器
最后,如果你的视图控制器没有使用默认初始化器,并且依赖于不同的用例或不同的数据集,你需要实现以下协议
// Swift
@objc public protocol ControllerFactoryUseCaseInstantiable {
static func getUseCases() -> [String]
static func initForControllerFactory(useCase: String) -> UIViewController
}
就像之前一样,getUseCases()
方法将允许你为不同的用例命名。
在 initForControllerFactory(useCase: String)
中,你使用自定义初始化器创建控制器。
然后调试视图将呈现不同的用例供你选择,在你实例化视图控制器之前。
鸣谢
本框架由 Worldline 的 Benoît Caron 和 Vincent Pradeilles 编写。
许可证
本框架在MIT许可证下提供。