1

我的应用程序中有一个映射功能。它属于选项卡栏控制器选项卡之一。

我遇到的问题是该应用程序在启动后立即要求位置权限。在用户真正进入应用程序的地图部分之前,我不想用与位置相关的问题来打扰用户。

如果我理解正确,位置管理器在我实例化它之前不应该费心要求它。此外,一旦用户离开应用程序的该地图部分,无论是通过选择其他选项卡还是按主页按钮..I nil 位置管理器。

那么为什么这么快就要求呢?我的问题是在这种特殊情况下是否有一些特殊规则......或者它是由我有缺陷的应用程序设计引起的?

4

3 回答 3

2

我会选择“流动应用程序设计”。你没有显示任何代码,所以很难说,但是 UITabBarController 一次实例化了它的所有视图控制器,所以你的 CCLocation 类可能正在用你的 TabBar 初始化。

您可以做的是:仅在-viewWillAppear您实际使用它的视图控制器上的方法上初始化您的 CCLocation 内容。

于 2013-06-06T12:03:47.013 回答
1

你可以写这样的东西。

H:

#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>

@interface LocationController : NSObject <CLLocationManagerDelegate> {
    CLLocationManager *locationManager;
    CLLocation *currentLocation;
} 

+ (LocationController *)sharedInstance;
- (void)start;
- (void)stop;

@property (nonatomic, strong) CLLocation *currentLocation;

@end

米:

#import "LocationController.h"

@implementation LocationController

static LocationController *sharedInstance;

+ (LocationController *)sharedInstance {
    static LocationController *sharedClient;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedClient = [[LocationController alloc] init];
    });
    return sharedClient;
}

-(id) init {
    if (self = [super init]) {
        currentLocation = [[CLLocation alloc] init];
        locationManager = [[CLLocationManager alloc] init];
        locationManager.delegate = self;
        [self start];
    }
    return self;
}

- (void)start {
    [locationManager startUpdatingLocation];
}

- (void)stop {
    [locationManager stopUpdatingLocation];
}

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
    CLLocation *loc = [locations lastObject];

    if ( abs([loc.timestamp timeIntervalSinceDate: [NSDate date]]) < 120) {
        self.currentLocation = loc;
    }
}

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
    NSLog(@"%@", error);
}

@end

然后,每当您需要定位时,您可以执行以下操作:

[[LocationController sharedInstance] start];
于 2013-06-06T12:16:46.927 回答
0

你在哪里实例化CLLocationManager?虽然在实例化选项卡栏控制器时会实例化所有视图控制器,但在您转到相关选项卡之前不会创建它们各自的视图。因此,如果您CLLocationManager在控制器的方法之一中实例化您的init,那么将在控制器存在时创建该位置管理器(即,当标签栏控制器被实例化时)。但是,如果您在 中实例化了位置管理器viewDidLoad,则在单击相应的选项卡之前不应实例化它。

于 2013-06-06T16:21:14.800 回答