从结构访问 UITabBarController 中的数据模型

Accessing Data Model in UITabBarController from a Struct

我有一个使用 UITabBarController 的应用程序,我有一个用于在各个选项卡之间传递信息的模型

class BaseTBController: UITabBarController {
  
  var title: String = ""
  var valueData =  Double()

  
  override func viewDidLoad() {
    super.viewDidLoad()
  }

通常在 TabBars 的任何选项卡中,我可以这样做:

let tabbar = tabBarController as! BaseTBController
let valueData = Int(tabbar.valueData) == 0 ? Int(UserDefaults.standard.double(forKey: UDKeys.valueData)) : Int(tabbar.valueData)

现在,我的情况是这样的,我想在辅助函数中使用 Tabbar 模型数据中的数据(作为结构)

这样做,不行。想知道是否有办法做到这一点,但我的 googling/SO 搜索技能达不到标准。 TX

struct DataFieldOptions{
  
  static func showValueAs() -> String {
    let tabbar = tabBarController as! BaseTBController
    let valueData = Int(tabbar.valueData) == 0 ? Int(UserDefaults.standard.double(forKey: UDKeys.valueData)) : Int(tabbar.valueData)

    return String(valueData)
  }

这似乎有点奇怪。如果你要添加一个“助手”,我希望你有一个 data-manager class 而不是在标签栏控制器中使用 var。

但是,tabBarController 是视图控制器的可选 属性。如果您想从视图控制器外部访问它,您需要给它一个引用。

附带说明一下,您显示的是 -> String 但返回的是 Int ...我猜您真的打算将值格式化为string 以某种方式,所以这是返回字符串的方法:

struct DataFieldOptions{
    static func showValueAs(vcRef vc: UIViewController) -> String {
        // safely make sure we have access to a tabBarController
        //  AND that it is actually a BaseTBController
        if let tbc = vc.tabBarController as? BaseTBController {
            let v = Int(tbc.valueData) == 0 ? Int(UserDefaults.standard.double(forKey: UDKeys.valueData)) : Int(tbc.valueData)
            return "\(v)"
        }
        return ""
    }
}

然后,从视图控制器中,您可以这样称呼它:

let str = DataFieldOptions.showValueAs(vcRef: self)