ioscllocationmanagermkmapviewdelegate

current user location not being able to be determined and zoomed in on


Im trying to get the current user location on the map view and have it be zoomed in on. This my code-

 #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]);  
 }

Following is the output-

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:

From the above lines, its clearly seen that mapView:didUpdateUserLocation: message did not get passed to map view's delegate at all. Same is the case with locationManager:didUpdateLocations:. The showsUserLocations property is supposed to send CLLocationManager's delegate, a viewcontroller (which is the same as MKMapView's delegate), this message also in its implementation. Is it not?


Solution

  • You've declared locationManager as an instance variable without synthesizing it's getters and setters. It's probably being deallocated. Just make it a property:

    @interface WhereamiViewController : UIViewController <CLLocationManagerDelegate, MKMapViewDelegate, UITextFieldDelegate>
    
    @property (nonatomic, strong) CLLocationManager *locationManager;
    
    @end
    

    As for the worldView, I don't see where you're setting something like worldView.delegate = self