由于UI编码,我的ViewController变得非常大



目前我正在处理一个项目,该项目在一个viewController中完成了所有任务。由于viewController上有这么多元素,我选择使用编码来执行UI,如下所示:

let myButton: UIButton = {
let button = UIButton(type: .system)
button.addTarget(self, action: #selector(openFunction), for: .touchUpInside)
button.translatesAutoresizingMaskIntoConstraints = false
return button
}()

由于有这么多按钮视图texifield标签等,以及它们所有的用代码编写的约束,我的viewController类变得越来越大。如何将所有UI代码保存在单独的文件中,并集成到我的viewController中?我不知道有什么简单的方法可以做到这一点,但我实际上很挣扎。任何建议都会很有帮助。

欢迎来到设计模式和代码体系结构的世界。它们是实现你追求的目标的各种方式。这是一个好迹象,表明你能够及早发现这个问题。

您可以开始查看MVVM、VIPER、ReSwift等。研究哪些适合您的应用程序要求。

减少视图控制器中UI代码的建议:

就减少视图控制器中增长的UI代码而言,我建议开始创建公共元素的子类,并保持代码DRY。例如,如果一个具有相同字体和边框等的UIButton被创建了很多次,那么就考虑为它创建一个子类,并在这个子类中移动配置。

你也可以在屏幕上创建逻辑元素的子视图,例如,你有一个带有按钮和标签的标题,然后将其移动到一个子类中,并从现在开始使用这个子类。这应该会提高代码的可读性和可重用性。

您还可以通过创建通用布局的扩展(如固定到所有角落等)来减少大量的autlayout代码,这样样板自动布局代码的重复就少了很多。

carbonr提出的替代方案是利用Interface Builder。使用界面生成器,您可以创建一个或多个情节提要,并从包含代码的控制器中分离UI元素和约束。显然,如果您不熟悉界面生成器,将会有一个学习曲线。

对特定代码的特定回答是在UIButton的扩展中创建一个convenience初始值设定项。

extension UIButton {
convenience init(_ target:Any, _ action:Selector) {
self.init(CGRect.zero)
self.addTarget(target, action:action)
self.translatesAutoresizingMaskIntoConstraints = false
}
}

就在那里,你可能正在削减你的VC中的东西。

接下来,考虑将这个和所有UI代码从VC文件中移到其他文件中。我通常会根据需要将扩展/子类移动到任意多的文件中。(编译可能需要更长的时间,但最终二进制文件的大小应该相同。)对于大型项目,这有助于使事情易于管理。

同时,考虑对VC进行扩展,特别是用于自动布局(我看到您正在使用它,因为您正在设置UIButton自动调整大小掩码)。只要您在主子类VC中声明对象,就可以将自动布局的"详细"特性删除到它自己的文件中。

对于多开发人员项目和/或真正的"可重用"代码,您可以做的最后一件事是将代码移动到框架目标中。

最新更新