我正在尝试告诉一个CLLocationManager对象,它是一个viewcontroller的属性,当appDelegate收到应用程序将进入后台的消息时,我不知道如何引用我的appDelegate类中的viewController对象。
答案 0 :(得分:2)
听起来你采取了错误的做法。由于位置管理器是视图控制器上的实例变量,因此它应该是视图控制器指示它停止 - 而不是应用程序委托。
这就是Cocoa / UIKit / Objective-C的设计工作方式,其他任何事情都是一场艰苦的战斗。
在viewController中可能是这样的:
@implementation MyViewController
- (id)init
{
...
self.locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
[self.locationManager startUpdatingLocation];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil];
...
}
- (void)dealloc
{
[self.locationManager stopUpdatingLocation];
[[NSNotificationCenter defaultCenter] removeObserver:self];
...
}
- (void)applicationWillEnterForeground:(NSNotification *)notif
{
[self.locationManager startUpdatingLocation];
}
- (void)applicationDidEnterBackground:(NSNotification *)notif
{
[self.locationManager stopUpdatingLocation];
}
@end
但要回答您的具体问题,您可以在视图控制器中使用此功能访问应用代理:
[UIApplication sharedApplication].delegate
这将让你告诉它有关视图控制器的信息。但要小心,因为你可能会造成内存泄漏!
您需要确保委托不保留视图控制器,否则永远不会取消分配。并且您需要确保在取消分配视图控制器时,委托对视图控制器的引用设置为nil。
一般来说,你应该避免让app delegate对任何特定的视图控制器都有所了解。
答案 1 :(得分:0)
当app即将进入后台时,viewcontroller中是否未调用viewWillDisappear委托方法?