我有一个名为ContentController的类。我从ViewController创建它的实例。第一个人从我的远程服务器获取一些数据,在其上做了一些事情。然后它将信息传递给ViewController,它向用户显示了一些好的东西。到目前为止一切都很好。
现在,问题在于使用AppDelegate。当应用程序尝试进入后台模式时,我想访问同一个实例(ContentController)。并在设备上保存少量属性。这不起作用。
你能帮帮我吗?
答案 0 :(得分:2)
如果您真的想从AppDelegate访问ContentController实例,可以在AppDelegate中创建一个属性。
//AppDelegate.h
@property (strong, nonatomic) ContentController *contentController;
当您需要在ViewController中使用它时,您可以使用
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
appDelegate.contentController = [[ContentController alloc] init];
或者您可以在我们的ViewController类中创建一个指向AppDelegate实例的属性。
self.contentController = appDelegate.contentController;
答案 1 :(得分:1)
从ContentController注册通知。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotification object:nil];
在Content控制器中实现applicationWillResignActive:
方法,以执行您想要的任务。
- (void)applicationWillResignActive:(NSNotification *)notification
{
// Your server calls
}
答案 2 :(得分:0)
要在applicationDidEnterBackground上保存属性值:您可以在class'es viewDidLoad方法中添加通知观察器,如下所示:
UIApplication *app = [UIApplication sharedApplication];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotification object:app];
在viewDidUnload中你应该添加:
[[NSNotificationCenter defaultCenter] removeObserver:self];
还要在类.m文件中添加这两个方法(下面您可以看到我的某个应用程序中的示例):
- (void)applicationWillResignActive:(NSNotification *)notification {
NSMutableArray *array = [[NSMutableArray alloc] init];
[array addObject:[NSNumber numberWithInt:self.event.eventID]];
[array addObject:self.event.eventName];
[array addObject:[NSNumber numberWithDouble:[self.event.ticketPrice doubleValue]]];
[array writeToFile:[self dataFilePath] atomically:YES];
[array release];
}
此方法将从您的文件加载数据,在viewDidLoad中调用:
- (void)loadEventFromEventPlist {
NSString *filePath = [self dataFilePath];
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
NSArray *array = [[NSArray alloc] initWithContentsOfFile:filePath];
self.event.eventID = [[array objectAtIndex:0] intValue];
self.event.eventName = [array objectAtIndex:1];
self.event.ticketPrice = [NSNumber numberWithDouble:[[array objectAtIndex:2] doubleValue]];
[array release];
}
}
获取文件名需要此方法:
- (NSString *)dataFilePath {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
return [documentsDirectory stringByAppendingPathComponent:@"data.plist"];
}