2013-11-19 4 views
4

Я использую класс CLLocationManager. У меня есть простой метод класса для захвата местаCLLocationManager Способы делегирования не набираются

+(void)captureLocation{ 
    mLocationManager = [[CLLocationManager alloc]init]; 
    mLocationManager.delegate = (id<CLLocationManagerDelegate>)self; 
    mLocationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    [mLocationManager startUpdatingLocation]; 
} 

и у меня есть методы делегата CLLocationManager также

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error 
{ 
} 
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
} 

теперь я пытаюсь вызвать этот метод в моем viewDidLoad, как

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [myclass captureLocation]; 
} 

метод вызывается, но методы делегата не вызываются.

У меня есть другой метод класса также и оттуда, если я попытаюсь вызвать метод снова, метод captureLocation получает вызов, но методы делегата не вызываются. Вот другой метод класса

+(void)initialize{ 
    [self captureLocation]; 
} 

, пожалуйста, помогите мне, чтобы узнать, почему делегат методы не вызывался, как я новичок в этой области. Заранее спасибо.

+0

Установили ли вы делегат ваш объект? – NinjaLikesCheez

+0

проверьте это: http://stackoverflow.com/questions/19603830/location-manager-giving-null-coordinates/19603959#19603959 –

+0

Не связанный с вашей проблемой, учитывая, что вы использовали тег 'ios7', стоит отметить что если вы используете только iOS 6 и более поздние версии, тогда разумно использовать 'locationManager: didUpdateLocations:', а не 'locationManager: didUpdateToLocation: fromLocation:'. Последний метод был устаревшим в iOS 6 и в конечном итоге может быть полностью удален. Ваш код будет более надежным в будущем, если вы используете версию 'didUpdateLocations'. – Rob

ответ

5

Вы установки delegate в CLLocationManager внутри метода класса (т.е. один префикс +, а не -). Итак, когда вы ссылаетесь на self в этом методе класса, это класс, а не экземпляр класса. Итак, вы пытаетесь установить класс delegate, а не экземпляр класса.

Это не сработает. Методы делегата - это методы экземпляра, а не методы класса. (Это, по-видимому, почему вы должны были использовать CLLocationManagerDelegate бросок при назначении delegate.)

Вы должны фактически создать экземпляр какого класса вы внедрили CLLocationManagerDelegate метод. Если вы не хотите привязывать этот экземпляр к определенному контроллеру представления, вы можете использовать одноэлементный шаблон. Независимо от этого, вы можете установить делегат менеджера местоположения, чтобы указать на этот экземпляр этого класса.


Например, если вы хотите, чтобы это было одноэлементно:

// MyClass.h 

#import <Foundation/Foundation.h> 

@interface MyClass : NSObject 

+ (instancetype)sharedManager; 
- (void)startCapture; 
- (void)stopCapture; 

@end 

и

// MyClass.m 

#import "MyClass.h" 
#import <CoreLocation/CoreLocation.h> 

@interface MyClass() <CLLocationManagerDelegate> 

@property (nonatomic, strong) CLLocationManager *locationManager; 

@end 

@implementation MyClass 

+ (instancetype)sharedManager 
{ 
    static id sharedMyManager = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedMyManager = [[self alloc] init]; 
    }); 
    return sharedMyManager; 
} 

- (void)startCapture 
{ 
    self.locationManager = [[CLLocationManager alloc] init]; 
    self.locationManager.delegate = self; 
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    [self.locationManager startUpdatingLocation]; 
} 

- (void)stopCapture 
{ 
    [self.locationManager stopUpdatingLocation]; 
    self.locationManager = nil; 
} 

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error 
{ 
    // ... 
} 

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 
{ 
    // ... 
} 

@end 

А потом,

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [[MyClass sharedInstance] startCapture]; 
} 
+0

Я не хочу, чтобы мой метод класса изменился на метод экземпляра. можно ли вызвать методы делегата из метода класса? – Newbee

+0

@Newbee Нет, методы делегата являются методами экземпляра и поэтому должны быть вызваны экземпляром объекта. Вы могли бы создать метод класса, создающий один синглтон, или сделать это, как в моем переработанном ответе, что делает его более очевидным, что вы имеете дело с синглом. – Rob

0

Вызов self в методе + установите делегат на нуль так как это означает ClassName, как в [[ClassName alloc] init].

вам нужно:

mLocationManager.delegate = mLocationManager

вместо

mLocationManager.delegate (id<CLLocationManagerDelegate>)self; 
+0

не работает. все еще методы делегата не вызываются. – Newbee

0

в ios6locationManager:didUpdateToLocation:fromLocation: устарела, так что вам нужно добавить еще один метод в коде ...

-(void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
      fromLocation:(CLLocation *)oldLocation 
{ 

     // this method get called in ios7 . 
} 
10

знают также, что разрешения CoreLocation изменились с прошивкой 8. Если вы не запрашивать новые разрешения разрешений, CoreLocation ничего не делает. Он терпит неудачу, потому что методы делегата никогда не вызываются.

Я понимаю, что этот вопрос был задан в 2013 году, но если у вас возникли аналогичные проблемы с методами делегата не вызывался, эта статья чрезвычайно полезна:

http://nevan.net/2014/09/core-location-manager-changes-in-ios-8/

Хотя статья очень подробно и долго, фактический код исправления может быть как незначительные, как это:

if ([locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) { 
    [locationManager requestWhenInUseAuthorization]; 
} 

и вы должны добавить значение info.plist, что сообщение будет отображаться в разрешениях оповещения. См. Захват экрана.

Screen grab of new entry in info.plist

Ключ: NSLocationWhenInUseUsageDescription

Значение: Расположение требуется, чтобы выяснить, где вы находитесь (Вы можете изменить это все, что вы хотите)

+1

Большое спасибо за ссылку. Я не знаю, почему люди не будут отдавать ответ за этот ответ, из-за отсутствия голосования я проигнорировал этот ответ ..... Thanx снова – sandy

+1

Спасибо. Сохранено мое время – iOSDev

Смежные вопросы