自分の locationManager を独自のクラスとファイルで調達しました
現在、場所が更新されたときに通知を受け取りたいと考えています。そこで、委任パターンを実装しようとしました。しかし、何らかの理由で機能しません。私がしたこと:
- Location.h: 指定されたクラス、プロトコル、ivar およびプロパティ ID、委任方法
- Location.m: delegation メソッドへの呼び出しを追加
- ViewController.h: 委任プロトコルを追加
- ViewController.m: 委譲メソッドを実装
コードをビルドして実行します。しかし、 ViewController.m の委任メソッドは呼び出されません:(私が見逃したアイデアはありますか?
出力
2013-07-04 11:55:30.429 Sandbox2[2001:c07] Inside Lokation::getLocation
2013-07-04 11:55:30.443 Sandbox2[2001:c07] Inside Lokation::locationManager
2013-07-04 11:55:30.449 Sandbox2[2001:c07] currentLat: 51.509980 currentLng -0.133700
// Missing NSLog Statement of the delegate method didFindLocation...
ViewController.h
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
// added Lokation header
#import "Lokation.h"
// added LokationDelegate
@interface ViewController : UIViewController <CLLocationManagerDelegate, LokationDelegate>
@end
ViewController.m
#import "ViewController.h"
@interface ViewController ()
@property (strong, nonatomic) Lokation *lokation;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
//[self getLocation];
self.lokation = [[Lokation alloc] init];
self.lokation.delegate = self;
[self.lokation getLocation];
}
// added delegate function of Lokation
// Should be run after the locationmanager found a location
-(void)didFindLocation {
NSLog(@"I am found a lokation and I am now in the ViewController");
}
Lokation.h (20130704 作業コードに更新)
#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>
// Added class, protocol and method for the delegate
@class Lokation;
@protocol LokationDelegate <NSObject>
-(void)didFindLocation;
@end
@interface Lokation : NSObject <CLLocationManagerDelegate> {
CLLocationDegrees currentLat;
CLLocationDegrees currentLng;
}
@property (strong, nonatomic) CLLocationManager *locationManager;
@property (nonatomic, strong) CLLocation *currentLoc;
// added delegate property
@property (assign, nonatomic) id<LokationDelegate> delegate;
-(void)getLocation;
@end
Lokation.m (20130704 作業コードに更新)
#import "Lokation.h"
@implementation Lokation
@synthesize locationManager = _locationManager;
@synthesize currentLoc = _currentLoc;
-(void)getLocation {
NSLog(@"Inside Lokation::getLocation");
// active location determination
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
self.locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
// We don't want to be notified of small changes in location,
// preferring to use our last cached results, if any.
self.locationManager.distanceFilter = 50;
[self.locationManager startUpdatingLocation];
}
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
NSLog(@"Inside Lokation::locationManager");
if (!oldLocation ||
(oldLocation.coordinate.latitude != newLocation.coordinate.latitude &&
oldLocation.coordinate.longitude != newLocation.coordinate.longitude)) {
currentLat = newLocation.coordinate.latitude;
currentLng = newLocation.coordinate.longitude;
} else { // oldLocation
currentLat = oldLocation.coordinate.latitude;
currentLng = oldLocation.coordinate.longitude;
}
self.currentLoc = [[CLLocation alloc] initWithLatitude:currentLat longitude:currentLng];
NSLog(@"currentLat: %f currentLng %f", currentLat, currentLng);
// added call to the delegate function
[self.delegate performSelector:@selector(didFindLocation)];
}
- (void)locationManager:(CLLocationManager *)manager
didFailWithError:(NSError *)error {
NSLog(@"%@", error);
}