如何在 Swift 程序化 UI 上组织我的 ViewScreens

How to Organize my ViewScreens on Swift Programmatic UI

我正在学习编程 UI 并且有点痴迷于干净的代码。

我目前正在构建一个 TabBarVC,以便我可以管理我所有的 VC,但是我在执行此操作时收到一条错误消息。

import UIKit

class MainTabBarVC: UITabBarController {
  
  let firstVC         = FirstVC()
  let secondVC        = SecondVC()
  
  let firstNavVC      = UINavigationController(rootViewController: firstVC)  // Cannot use instance member 'firstVC' within property initializer; property initializers run before 'self' is available
  let secondNavVC     = UINavigationController(rootViewController: secondVC) // Cannot use instance member 'secondVC' within property initializer; property initializers run before 'self' is available
  
  let viewControllers = [firstNavVC, secondNavVC]
  
  override func viewDidLoad() {
    super.viewDidLoad()
    
    self.setupViews()
  }
  
  func setupViews() {
    // Nav Configs
    self.firstVC.view.backgroundColor     = .systemBackground
    self.firstVC.navigationItem.title     = "First Nav"
    
    self.secondVC.view.backgroundColor    = .systemBackground
    self.secondVC.navigationItem.title    = "Second Nav"
    
    // Tab Configs
    self.firstNavVC.tabBarItem.title      = "First TAB"
    
    self.secondNavVC.tabBarItem.title     = "Second TAB"
  }
}

我知道如果我将 firtNavVC、secondNavVC 和 viewcontrollers 放在 setupViews 中它会起作用,但我不喜欢它,尤其是当一个函数有太多代码行时当它变大时。

所以除了我的问题,是否有任何扩展或枚举函数可以让我轻松管理我的所有 UINavigationController、UITabBarController 和 UIViewController 比如枚举可以在我需要调用或者添加新的时候调用函数 VC.

您可以将 let 更改为 lazy var

class MainTabBarVC: UITabBarController {
  
  lazy var firstVC         = FirstVC()
  lazy var secondVC        = SecondVC()
  
  lazy var firstNavVC      = UINavigationController(rootViewController: firstVC)
  lazy var secondNavVC     = UINavigationController(rootViewController: secondVC)
  
  lazy var viewControllers = [firstNavVC, secondNavVC]
  
  override func viewDidLoad() {
    super.viewDidLoad()
    
    self.setupViews()
  }

但是,我认为您维护对所有这些视图控制器的实例 属性 引用的冲动是错误的。我要做的就是将 let 移到 setupViews 中。您不需要对任何这些对象的 永久 引用;您只需要创建它们、配置它们并将视图控制器分配为您的选项卡栏控制器的子项(顺便说一下,您的代码缺少关键步骤)。