Reputation: 1686
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
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:
Upvotes: 1