当前用户位置无法确定和放大

时间:2017-08-25 17:02:22

标签: ios cllocationmanager mkmapviewdelegate

我试图在地图视图上获取当前用户位置并将其放大。 这是我的代码 -

 #import "WhereamiAppDelegate.h"
 #import "WhereamiViewController.h"


  @implementation WhereamiAppDelegate

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
 {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.viewController = [[WhereamiViewController alloc] initWithNibName:@"WhereamiViewController" bundle:nil];
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
return YES;
}
@interface WhereamiViewController : UIViewController<CLLocationManagerDelegate,MKMapViewDelegate,UITextFieldDelegate>
 {

//@public RootObject *rootObj;
  CLLocationManager *locationManager;

 IBOutlet MKMapView *worldView;
 IBOutlet UIActivityIndicatorView *activityIndicator;
 IBOutlet UITextField *locationTitleField;
 }
-(IBAction)buttonDidGetPressed:(id)sender;
-(BOOL)textFieldShouldReturn:(UITextField *)textField;
-(void)findLocation;
-(void)foundLocation:(CLLocation *)loc;
@end

@implementation WhereamiViewController
-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
   NSLog(@"%@", NSStringFromSelector(_cmd));
   if (self=[super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
    // rootObj= [[RootObject alloc] init];//RootObject initialised
    // NSLog(@"RootObject–– %@",rootObj);
     locationManager= [[CLLocationManager alloc] init];

     [locationManager setDelegate:self];//self is Whereamicontroller. The delegate pointer is of type id<CLLocationManagerDelegate> and is an ivar of CLLocationManager.
     [locationManager setDesiredAccuracy:kCLLocationAccuracyBest];

 }
 return self;
}

-(void) viewDidLoad{
  NSLog(@"%@",NSStringFromSelector(_cmd));
  worldView.showsUserLocation=YES;
}

-(void)mapViewWillStartLocatingUser:(MKMapView *)mapView{
    NSLog(@"%@", NSStringFromSelector(_cmd));
 }
-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{
   NSLog(@"%@",NSStringFromSelector(_cmd));

   CLLocationCoordinate2D centerCoordinate= [userLocation coordinate]; //get the coordinate of current location.
   NSLog(@"%@ (%f, %f)",userLocation.location,centerCoordinate.latitude,centerCoordinate.longitude);
   MKCoordinateSpan span= MKCoordinateSpanMake(250, 250);//Structure members
   MKCoordinateRegion mapPortionToDisplay= MKCoordinateRegionMakeWithDistance(centerCoordinate, span.latitudeDelta, span.longitudeDelta);//span.latitudeDelta=250 and span.longitudeDelta=250

   [worldView setRegion:mapPortionToDisplay animated:YES];
//        [worldView setRegion:mapPortionToDisplay];

   [worldView regionThatFits:mapPortionToDisplay];
}

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{ //CLLocationManagerDelegate method implementation
  NSLog(@"%@", NSStringFromSelector(_cmd));
//    NSTimeInterval t0=[[locations lastObject] timeIntervalSinceNow];
NSLog(@"current location–– %@",(CLLocation *)[locations lastObject]);  
 }

以下是输出 -

2017-08-25 22:16:19.178 Whereami2 [1601:758525] initWithNibName:bundle:

2017-08-25 22:16:19.294 Whereami2 [1601:758525] viewDidLoad

2017-08-25 22:16:20.607 Whereami2 [1601:758525] mapViewWillStartLocatingUser:

从以上几行可以清楚地看到, mapView:didUpdateUserLocation:消息根本没有传递给地图视图的委托。 locationManager:didUpdateLocations:的情况也是如此。 showsUserLocations属性应该发送CLLocationManager的委托,一个viewcontroller(与MKMapView的委托相同),这个消息也在它的实现中。不是吗?

1 个答案:

答案 0 :(得分:1)

您已将locationManager声明为实例变量而未合成它的getter和setter。它可能正在被取消分配。把它变成一个属性:

@interface WhereamiViewController : UIViewController <CLLocationManagerDelegate, MKMapViewDelegate, UITextFieldDelegate>

@property (nonatomic, strong) CLLocationManager *locationManager;

@end

至于worldView,我看不出你在哪里设置worldView.delegate = self