关闭暗黑模式

先分享下如何关闭暗黑模式,因为一旦关闭暗黑模式,暗黑模式的所有回调都不会触发。

MBDNavigationController

override init(rootViewController: UIViewController) {
  
  super.init(rootViewController: rootViewController)
  //关闭暗黑模式
  if #available(iOS 13.0, *) {
      //统一使用白色模式
      self.overrideUserInterfaceStyle = UIUserInterfaceStyle.light

  } else {
      // Fallback on earlier versions
  }

}

模式切换回调

任何 Controller 或者 View 或者 Cell

回调方法

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {

}

弊端

每个 view 或者 cell 都要复写这个回调方法

最佳实践

Base View Controller

在 BaseViewController 中实现该方法:

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        super.traitCollectionDidChange(previousTraitCollection)
        
        if #available(iOS 13.0, *) {
            if traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
                updateColors()
            }
        } else {
            // Fallback on earlier versions
        }
        
    }

func updateColors() {
        view.setDynamicBackgroundColor()
        // 子类可以重写此方法来更新特定的UI元素
    }

View Controller

子 Controller 中复写 updateColors 方法即可。比如:

override func updateColors() {
        tableView.setDynamicBackgroundColor()
        searchBar.setDynamicSearchBarBackgroundColor()
        
        // 遍历并更新 cellModels
        if let cellModels = self.viewModel.cellModels {
            for i in 0..<cellModels.count {
                let updatedGroupDetail = cellModels[i].groupDetail
                
                // 重新设置 groupDetail
                self.viewModel.cellModels?[i].groupDetail = updatedGroupDetail
            }
        }
        
        self.tableView.reloadData()
    }