Один из вариантов, который у вас есть, - это объявить вашу модель даты как переменные экземпляра вашего делегата приложения (как упоминалось другими комментаторами).
Вместо того, чтобы ссылаться на делегат приложения, как предлагает nevan, альтернативой является добавление свойства в классы контроллера представления (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];
См. Также обсуждение переполнения стека о синглетонах.