我们假设我的应用程序有多个UIView
(例如"标签视图"),但所有这些视图都使用相同的数据来显示内容,当然,我不想为每个视图再次加载它。
我可以使用segue传输数据,但由于这些视图并非真正与层次结构相关(每个UIView
将使用的数据不是由另一个UIView
生成的),如果我有变量可以在applicationDidFinishedLaunching
中获取内容(例如),那么如果我的每个视图都可以访问这些变量,那么我会感觉更合乎逻辑。
我该怎么做?有没有一种方法更受苹果推荐?
答案 0 :(得分:2)
您应该使用 Model 类。模型代表您的应用程序(ApplicationModel)中的数据,就是那个 - 也就是说,没有视图,没有UI。
当应用启动时,您可以设置模型对象。通常,模型对象是“单例”。
如上所述,应用程序模型代表应用程序中的数据。假设该模型代表人员及其地址列表:
NSArray* users = [Model sharedModel].users;
NSString* firstName = users[0].firstName;
UIImage* image = users[0].image;
现在,TabView的一个用例是它显示具有不同视图的相同数据。请注意,与选项卡关联的每个控制器都是“根控制器”。
假设视图#1显示包含所有用户的表视图,视图#2显示呈现用户图像的集合视图。
在这种情况下,每个根视图控制器都将使用
获取用户数组NSArray* users = [Model sharedModel].users;
请注意,在选项卡视图控制器中,即使切换到另一个选项卡,与某个选项卡关联的控制器仍会加载。也就是说,例如,标签#2的标签,如果已加载,则不会加载视图控制器#2。
当用户数组可以更改时,或者当数组中的对象发生更改时,事情会变得更复杂。在这种情况下,我们需要一种机制,通知每个控制器其模型已被更改。
解决此问题的一种方法是每个根视图控制器通过KVO观察共享模型的属性user
。这样,当从模型中获得的用户阵列发生变化并且控制器可以更新其当前的用户数组时,控制器会收到通知。
答案 1 :(得分:1)
您可以创建要在app代理中用作属性的变量,并且可以使用app delegate的对象访问该变量。 例如,在Appdelegate.h文件中创建一个字符串
@property (strong, nonatomic) NSString *yourString;
并从任何控制器访问此字符串
NSString *string = ((AppDelegate *)[[UIApplication sharedApplication] delegate]).yourString;
答案 2 :(得分:1)
在.h文件中声明属性,如:
@property (strong, nonatomic) NSString *testName;
表格任何其他课程都这样做:
let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let aVariable = appDelegate.testName
希望这会有所帮助.. :)
答案 3 :(得分:1)
您可以将单例实例类与共享数据一起使用。
class MyData {
class var sharedInstance : MyData {
struct Static {
static let instance : MyData = MyData()
}
return Static.instance
}
}
然后在每个视图控制器中
let sharedData = MyData.sharedInstance