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