如何在Swift Programmatic UI上组织ViewScreens

mpgws1up  于 2023-05-16  发布在  Swift
关注(0)|答案(1)|浏览(171)

我正在学习程序化用户界面,我有点痴迷于干净的代码。
我目前正在构建一个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。

7lrncoxx

7lrncoxx1#

您可以将let s更改为lazy var s。

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 s移动到setupViews中。你不需要一个对这些对象的永久引用;你只需要创建它们,配置它们,并将视图控制器指定为选项卡栏控制器的子控件(顺便说一句,你的代码缺少这一关键步骤)。

相关问题