从AppDelegate访问其他类实例

时间:2012-05-01 08:09:41

标签: objective-c ios

我有一个名为ContentController的类。我从ViewController创建它的实例。第一个人从我的远程服务器获取一些数据,在其上做了一些事情。然后它将信息传递给ViewController,它向用户显示了一些好的东西。到目前为止一切都很好。

现在,问题在于使用AppDelegate。当应用程序尝试进​​入后台模式时,我想访问同一个实例(ContentController)。并在设备上保存少量属性。这不起作用。

你能帮帮我吗?

3 个答案:

答案 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
}

https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Notifications/Articles/Registering.html#//apple_ref/doc/uid/20000723-98481-BABHDIGJ

答案 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"];
}