0

由于这一行,CoreLocation 无法编译

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

我已经尝试了所有方法,现在对重新链接 coreLoction 感到厌烦

如果我注释掉那一行 CoreLocation 编译得很好。

我在构建阶段包含了 corelocation 和 mapkit,我没有框架搜索路径

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)

我在另一个项目中使用了这段代码,它编译得很好,我错过了什么?

主控制器

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

我在另一个项目中完全使用的 LocationAnnotation 文件没有任何问题

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

奇怪的是 - (id)initWithTitle 行不会正确地为语法着色。此代码适用于一个项目,但不适用于另一个项目......??!!

4

1 回答 1

1

您的代码编译,它是报告问题的链接器。链接器找不到您的LocationAnnotation类,因为它可能没有被编译。LocationAnnotation.m在 Xcode 和File Inspector中选择(在右侧托盘中)并确保该文件是您的目标的成员:

选择目标成员

于 2013-03-23T05:21:56.463 回答