JulianB
JulianB

Reputation: 1686

CoreLocation wont compile - same set-up as another working project

CoreLocation wont compile because of this line

LocationAnnotation *annotation = [[LocationAnnotation alloc] initWithTitle:@"Point to home?" andCoordinate:newLocation.coordinate andSubtitle:nil];

I've tried everything and am now bored of relinking coreLoction

If I comment out that line CoreLocation compiles fine.

I have included corelocation and mapkit in the build phase, I have no framework search paths

Undefined symbols for architecture i386:
  "_OBJC_CLASS_$_LocationAnnotation", referenced from:
      objc-class-ref in JobMapVC.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

I have used this code in another project an it compiles fine, what am I missing?

The main controller

JobMapVC.h

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>

#import "LocationAnnotation.h"

@interface JobMapVC : UIViewController <MKMapViewDelegate, CLLocationManagerDelegate>
{
    NSString *address;

@private
    CLLocationManager *locationManager;
}

@property (nonatomic, strong) NSString *address;
@property (nonatomic, retain) CLLocationManager *locationManager;
@property (nonatomic, assign, readwrite) double homeLatitude;
@property (nonatomic, assign, readwrite) double homeLongitude;

@property (weak, nonatomic) IBOutlet MKMapView *mapView;

- (IBAction)dismissMap:(id)sender;

@end

JobMapVC.m

#import "JobMapVC.h"
#import "LocationAnnotation.h"

@interface JobMapVC ()

@end

@implementation JobMapVC
{
}

@synthesize address = _address;
@synthesize locationManager = _locationManager;

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self searchCoordinatesForAddress:_address];
}


- (void) searchCoordinatesForAddress:(NSString *)inAddress{

    NSString *cleanAddress = [[inAddress componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]] componentsJoinedByString:@" "];

    NSMutableString *urlString = [NSMutableString stringWithFormat:@"http://maps.googleapis.com/maps/api/geocode/json?sensor=true&address=%@",cleanAddress];

    [urlString setString:[urlString stringByReplacingOccurrencesOfString:@" " withString:@"+"]];

    NSURL *url = [NSURL URLWithString:urlString];
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
    NSError* error;
    NSURLResponse *response;
    NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

    NSDictionary* georesults = [NSJSONSerialization
                                JSONObjectWithData:returnData
                                options:NSJSONReadingMutableContainers | NSJSONReadingAllowFragments
                                error:&error];


    if ( [[georesults objectForKey:@"status"] isEqualToString:@"OK"] )
    {

        double latitude  = [[[[[[georesults objectForKey:@"results"]objectAtIndex:0] objectForKey:@"geometry"]objectForKey:@"location"]objectForKey:@"lat"] doubleValue];
        double longitude = [[[[[[georesults objectForKey:@"results"]objectAtIndex:0] objectForKey:@"geometry"]objectForKey:@"location"]objectForKey:@"lng"] doubleValue];
        NSLog(@"lat:%f", latitude );

        [self zoomMapAndCenterAtLatitude:latitude andLongitude:longitude];

    }
}

- (void) zoomMapAndCenterAtLatitude:(double)latitude andLongitude:(double)longitude
{
    MKCoordinateRegion region;
    region.center.latitude  = latitude;
    region.center.longitude = longitude;

    //Set Zoom level using Span
    MKCoordinateSpan span;
    span.latitudeDelta  = .005;
    span.longitudeDelta = .005;
    region.span = span;

    //Move the map and zoom
    [_mapView setRegion:region animated:YES];

    // Map pin

    CLLocation *newLocation = [[CLLocation alloc] initWithLatitude:latitude longitude:longitude];

    // THIS LINE STOP coreLocation from compiling !!!
    LocationAnnotation *annotation = [[LocationAnnotation alloc] initWithTitle:@"Point to home?" andCoordinate:newLocation.coordinate andSubtitle:nil];

    [self.mapView addAnnotation:annotation];
    [self.mapView selectAnnotation:annotation animated:YES];

}

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

    if (error.code == kCLErrorDenied)
    {
        UIAlertView *alert = [[UIAlertView alloc]
                              initWithTitle:@"Error!"
                              message:@"This can not work without location services enabled"
                              delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alert show];
    }
}


- (IBAction)dismissMap:(id)sender
{
    [self dismissModalViewControllerAnimated:YES];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

@end

The LocationAnnotation file which I've used exactly as is in another project without any issues

LocationAnnotation.h

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

@interface LocationAnnotation : NSObject <MKAnnotation> {
}
@property (strong) NSString *title;
@property (strong) NSString *subtitle;

- (id)initWithTitle:(NSString *)ttl andCoordinate:(CLLocationCoordinate2D)c2d andSubtitle:(NSString *)sbttl;

@end

LocationAnnotation.m

#import "LocationAnnotation.h"

@implementation LocationAnnotation

@synthesize title, subtitle, coordinate;

- (id)initWithTitle:(NSString *)ttl andCoordinate:(CLLocationCoordinate2D)c2d andSubtitle:(NSString *)sbttl {
    if ((self = [super init])) {
        title = ttl;
        subtitle = sbttl;
        coordinate = c2d;
    }
    return self;
}

@end

The weird thing is the - (id)initWithTitle line wont colour the syntax properly. This code works ion one project but not another...??!!

Upvotes: 0

Views: 145

Answers (1)

Sebastian
Sebastian

Reputation: 7720

Your code compiles, it's the linker that's reporting the problem. The linker cannot find your LocationAnnotation class, because it probably wasn't compiled. Select the LocationAnnotation.m in Xcode and in the File Inspector (in the right tray) and make sure that the file is a member of your target:

select target membership

Upvotes: 1

Related Questions