我的应用程序是一个标签栏应用,与为每个标签单独的视图控制器。
我在我的第一视图控制器(A)的对象,其中包含所有我的存储的应用程序数据(请忽略此NSUserDefaults的),其需要当我按下在其上的按钮,由第二视图控制器(B)进行访问。 我怎样才能以最好的方式实现这一目标?
我的应用程序是一个标签栏应用,与为每个标签单独的视图控制器。
我在我的第一视图控制器(A)的对象,其中包含所有我的存储的应用程序数据(请忽略此NSUserDefaults的),其需要当我按下在其上的按钮,由第二视图控制器(B)进行访问。 我怎样才能以最好的方式实现这一目标?
你有一个选择是宣布你的约会对象模型应用程序委托的实例变量(如其他评论者提到的)。
代替引用该应用程序委托由妮娃所建议的一种替代方法是对数据模型添加属性到视图控制器类(A和B)。
假设你想分享一个数据模型对象视图控制器之间可以将属性添加到每个:
@interface AViewController : UIViewController {
MyDataModel *model;
}
@property (nonatomic, retain) MyDataModel *model;
@end
@interface BViewController : UIViewController {
MyDataModel *model;
}
@property (nonatomic, retain) MyDataModel *model;
@end
当你初始化你的视图控制器然后可以设置该属性先前初始化对象上下文。
你刚才提到一个标签栏控制器。 如果您的视图控制器通过IB有线所有你需要做的是设置在您的应用程序委托这些参数applicationDidFinishLaunching:
方法,显示标签栏控制器之前:
@interface MyAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate>
{
MyDataModel *model;
AViewController *aViewController;
BViewController *bViewController;
...
}
@property (retain) IBOutlet AViewController *aViewController;
@property (retain) IBOutlet BViewController *aViewController;
@end
@implementation MyAppDelegate
...
- (void)applicationDidFinishLaunching:(UIApplication *)application
{
...
aViewController.model = model;
bViewController.model = model;
[window addSubview:tabBarController.view];
[window makeKeyAndVisible];
}
不要忘了释放模型视图控制器dealloc
方法。
另一种方法是使用一个单独的对象。 一个简单的单例如:
@interface MyDataModel : NSObject
{
}
+ (MyDataModel *) sharedDataModel;
@end
@implementation MyDataModel
static MyDataModel *sharedDataModel = nil;
+ (MyDataModel *) sharedDataModel
{
@synchronized(self)
{
if (sharedDataModel == nil)
{
sharedDataModel = [[MyDataModel alloc] init];
}
}
return sharedDataModel;
}
@end
您可以访问,并显示类似下面的内容你所有的视图控制器这个数据模型:
MyDataModel *model = [MyDataModel sharedDataModel];
另请参见本关于单身堆栈溢出讨论。
我已经看到了这个最常用的方法是设置要在应用程序委托访问和在其他地方像这样引用它的东西:
MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
myStuff = appDelegate.stuff;
在应用程序的委托,建立一个东西变量并使用@property和@synthesize如常。
有人说,这不是一个好办法,因为它就像使用全局变量,但它是很常见的。
我喜欢创造一个顶层模型类,它是一个独立的,并包含了所有我可能需要的元素。
这是有帮助的也给它填充只用分贝键的对象,使用水合物的顶级负荷法/脱水常见的模式在苹果的例子。
在应用程序的委托典型用法是简单的,
[[MyModel sharedModel] load];
然后在一个视图控制器:
NSArray *myThing1s = [[MyModel sharedModel] thing1s];
NSArray *myThing2s = [[MyModel sharedModel] thing2s];
然后,您可以遍历您thing1s和thing2s,当你需要的细节,你可以叫
[myThing1 hydrate];
这将填充物。
当然,你可能想使用CoreData从3.0管理持久性起。
我总是创建一个名为的特殊对象DataModel
和使用它的单sharedInstance
。
这个对象则包含所有的应用程序相关的数据。 无需访问可怕 appDelegate
。
DataModel.h
#import <Foundation/Foundation.h>
@class MyClass1, MyClass2;
@interface DataModel : NSObject
@property (copy, nonatomic) NSString *aString;
@property (assign) BOOL aBool;
@property (strong) MyClass1 *myObject1;
@property (strong) MyClass2 *myObject2;
+ (DataModel *)sharedModel;
@end
DataModel.m
#import "DataModel.h"
#import "Class1.h"
#import "Class2.h"
@implementation DataModel
- (id) init
{
self = [super init];
if (self)
{
_myObject1 = [[MyClass1 alloc] init];
_myObject2 = [[MyClass2 alloc] init];
aBool = NO;
aString = nil;
}
return self;
}
+ (DataModel *)sharedModel
{
static DataModel *_sharedModel = nil;
static dispatch_once_t onceSecurePredicate;
dispatch_once(&onceSecurePredicate,^
{
_sharedModel = [[self alloc] init];
});
return _sharedModel;
}
@end
和(bacause我懒)我把DataModel.h
在application-prefix.pch
。
这样我可以从任何地方只需调用访问应用程序中的我的数据
[DataModel sharedModel]
两个视图控制器应该引用的第三个目的(C)作为其DataSource; 这个对象(C)含有所有所存储的应用数据。
C将是,在这种情况下,M在MVC的。
添加到您的每个ViewControllers以下声明:
// SomeViewController.h
// Before @interface
@class MyDataSource;
// In the interface
IBOutlet MyDataSource *datasource;
@property(retain) IBOutlet MyDataSource *datasource;