我正在尝试从我的视图控制器(在类中但在函数外部)创建一个全局变量,如下所示:
var modelData: CustomTabBarController.model // THE ERROR IS HERE
这是该类的定义方式:
CustomTabBarController.swift:
import UIKit
// This class holds the data for my model.
class ModelData {
var name = "Fred"
var age = 50
}
class CustomTabBarController: UITabBarController {
// Instantiate the one copy of the model data that will be accessed
// by all of the tabs.
var model = ModelData()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
}
但是我收到以下错误:
"'model' is not a member type of "CustomTabBarController"
如何声明它以便我可以访问模型?感谢。
更新#1 对不起,我忘了提这个:
我需要在tabbar的每个选项卡中将模型数据作为SAME。例如,如果我在第一个标签中将年龄更改为51,则第二个标签栏应该检索51.以上哪种方法可以通过这种方式使用它?
更新#2
我可以使用院长的建议在函数内创建变量:
func setupModelData()
{
var modelData = (self.tabBarController as! CustomTabBarController).model
}
但是这不起作用,因为我需要从其他函数访问modelData。当我尝试将此行移动到函数之外时,如下所示:
import UIKit
class FirstViewController: UIViewController, UITableViewDelegate, UITableViewDataSource
{
var modelData = (self.tabBarController as! CustomTabBarController).model
...
我收到错误:
Value of type '(NSObject) -> () -> FirstViewController' has no member 'tabBarController'
答案 0 :(得分:5)
我最终关注了holex关于创建共享类(singleton)的建议:
import UIKit
class ModelData: NSObject {
static let shared: ModelData = ModelData()
var name = "Fred"
var age = 50
}
在第一个视图中书写:将年龄设置为51:
ModelData.shared.age = 51
在第二个视图中阅读:年龄为51
let age = ModelData.shared.age
答案 1 :(得分:1)
我不确定您是否真的想要一个全局变量(即所有视图控制器之间共享的ModelData的单个实例)或公共的实例变量,所以我将尝试回答这两个问题: )
1)全球模式
此行尝试从CustomerTabBarController
类获取模型属性 - 即,如果您创建了多个标签栏控制器,则它们都将使用相同的模型。
var modelData: CustomTabBarController.model
如果这是您想要的,那么您需要更改此行以包含static关键字。
static var model = ModelData()
但是,这几乎肯定不是你所追求的。
2)共享实例变量
这意味着该模型是CustomTabBarController
的每个实例的一部分。在这里,您需要将引发错误的行更改为:
var modelData: myCustomTabBarController.model
在不了解您的架构的情况下,我无法帮助您掌握标签栏控制器实例,但这样的事情可能会起作用(在其他视图控制器内):
var modelData = (self.tabBarController as! CustomTabBarController).model
答案 2 :(得分:0)
model
是一个实例变量。
创建CustomTabBarController
var modelData = CustomTabBarController().model
或者将model
声明为类变量
static var model = ModelData()
...
var modelData = CustomTabBarController.model
但是,要将ModelData
用作具有两个成员的单个全局变量,请使用结构而不是类,并将成员声明为静态。
struct ModelData {
static var name = "Fred"
static var age = 50
}
您可以从任何地方访问该名称,例如
let name = ModelData.name
并且不需要在另一个类中创建额外的变量。
An - 基于实例 - 替代是单身
struct ModelData {
static let shared = ModelData()
var name = "Fred"
var age = 50
}
并使用它
let name = ModelData.shared.name