2011-02-11 18 views
8

Pracuję nad tą aplikacją na iPhone'a od jakiegoś czasu i miałem ją całkowicie ukończoną i działającą. Projekt, na który się rozwijałem, został pobrany z repozytorium subversion, które dostał mój profesor. Przypadkowo nie pobrałem kopii "root" lub czegoś podobnego, więc nie mogłem dokonać zmian w repozytorium. Przy pomocy moich instruktorów pobrałem dzisiaj kopię root'a i dodałem do niej wszystkie pliki klas, aby móc zatwierdzić zmiany. Jednak teraz jestem coraz 3 dziwne błędy, że nigdy nie widział:Odniesienie do obiektu klasy Objective: Nie znaleziono błędu symboli

Undefined symbolami:

"_OBJC_CLASS _ $ _ mapListViewController" odwołuje Od: objc-klasa-ref-to-mapListViewController w mapViewController.o

"_OBJC_CLASS _ $ _ mapParser" odwoływać od: objc-klasa-ref-do-mapParser w mapViewController.o

"_OBJC_CLASS _ $ _ mapTabViewController" odwoływać od: objc-klasa-ref-do-mapTabViewController w mapViewController.o

ld: Symbol (e) Nie znaleziono collect2: ld powrócił 1 status wyjścia

To jest dokładny komunikat o błędzie, który otrzymuję. Nie zmieniłem żadnego kodu z wersji, która działała zupełnie wcześniej dziś rano. Jakakolwiek rada? Wygląda na to, że przyczyną problemu jest plik mapViewController, dlatego też:

#import "mapViewController.h" 
#import "locationDetailViewController.h" 
#import "DPUAnnotation.h" 
#import "mapParser.h" 
#import "mapListViewController.h" 
#import "mapTabViewController.h" 

@implementation mapViewController 
@synthesize locationManager, mapView, mapAnnotations, mParser, mapListView, tabView; 

@class DPUAnnotation; 

+ (CGFloat)annotationPadding; 
{ 
    return 10.0f; 
} 
+ (CGFloat)calloutHeight; 
{ 
    return 40.0f; 
} 

- (void)gotoLocation 
{ 
    // start off by default at DePauw campus 
    MKCoordinateRegion newRegion; 
    newRegion.center.latitude = 39.639348; 
    newRegion.center.longitude = -86.861231; 
    newRegion.span.latitudeDelta = 0.006776; 
    newRegion.span.longitudeDelta = 0.006291; 

    [self.mapView setRegion:newRegion animated:YES]; 
} 

- (void)viewDidLoad { 

    self.title = @"Map"; 
    mapView.mapType = MKMapTypeHybrid; 
    mapView.showsUserLocation = YES; 

    mapListView = [[mapListViewController alloc] initWithNibName:@"mapListView" bundle:nil]; 
    tabView = [[mapTabViewController alloc] initWithNibName:@"mapTabViewController" bundle:nil]; 

    if (mapAnnotations == nil) 
    { 
     self.mapAnnotations = [NSMutableArray array]; 
    } 
    else 
    { 
     [mapAnnotations removeAllObjects]; 
    } 

    UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"btn_home.png"] style:UIBarButtonItemStyleBordered target:self action:@selector(mainpageClicked)]; 
    [self.navigationItem setLeftBarButtonItem:backButton]; 

    UIBarButtonItem *mapListButton = [[UIBarButtonItem alloc] initWithTitle:@"Building List" style:UIBarButtonItemStylePlain target:self action:@selector(pushMapList)]; 
    [self.navigationItem setRightBarButtonItem: mapListButton]; 

    locationManager = [[CLLocationManager alloc] init]; 
    locationManager.delegate = self; 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    [locationManager startUpdatingLocation]; 

    [self gotoLocation]; 

    self.mParser = [[[mapParser alloc] init] autorelease]; 
    self.mParser.delegate = self; 
    [self.mParser start]; 

    [super viewDidLoad]; 
} 

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:(BOOL)animated]; 
} 

- (void)dealloc 
{ 
    [mapView release]; 
    [locationManager release]; 
    [mapAnnotations release]; 

    [super dealloc]; 
} 

/* 
* Returns the User to the main Application Page 
*/ 
- (IBAction)mainpageClicked 
{ 
    NSLog(@"Return To Main page Clicked"); 
    [self.parentViewController dismissModalViewControllerAnimated:YES]; 
    [self.navigationController release]; 
} 

- (IBAction) pushMapList 
{ 
    tabView = [[mapTabViewController alloc] initWithNibName:@"mapTabViewController" bundle:nil]; 
    tabView.mapAnnotations2 = mapAnnotations; 
    [self.navigationController pushViewController:tabView animated:YES]; 
    [tabView release]; 
} 

- (IBAction)addAnnotation 
{ 
    [self.mapView removeAnnotations:self.mapView.annotations]; 

    for (int i = 0; i < [mapAnnotations count]; i++) 
     [mapView addAnnotation:[mapAnnotations objectAtIndex:i]]; 
    NSLog(@"BLAH BLAH BLAH PLEASE PRINT"); 
    if([mapAnnotations count] == 0) 
     NSLog(@"array is empty"); 
} 

- (void)showDetails:(id)sender 
{ 
    NSInteger selectedIndex = [sender tag]; 
    DPUAnnotation *selectedObject = [mapAnnotations objectAtIndex:selectedIndex]; 

    [self.navigationController setToolbarHidden:YES animated:NO]; 

    NSURL *url = [NSURL URLWithString: selectedObject.url]; 

    locationDetailViewController *locationDetailView; 
    locationDetailView = [[locationDetailViewController alloc] initWithNibName:@"mapDetailView" bundle:nil]; 
    [self.navigationController pushViewController:locationDetailView animated:YES]; 
    [locationDetailView.webView loadRequest: [NSURLRequest requestWithURL:url]]; 
    [locationDetailView release]; 

    [selectedObject release]; 
} 

- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation 
{ 
    // if it's the user location, just return nil. 
    if ([annotation isKindOfClass:[MKUserLocation class]]) 
     return nil; 

    if([[annotation subtitle] isEqualToString:@"Academic"]) 
    { 
     // try to dequeue an existing pin view first 
     static NSString* annotationIdentifier = @"annotationIdentifier"; 
     MKPinAnnotationView* pinView = (MKPinAnnotationView *)[theMapView dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier]; 

     if (!pinView) 
     { 
      MKAnnotationView *annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation 
                      reuseIdentifier:annotationIdentifier] autorelease]; 
      annotationView.canShowCallout = YES; 

      UIImage *academicImage = [UIImage imageNamed:@"academic.png"]; 

      CGRect resizeRect; 

      resizeRect.size = academicImage.size; 
      CGSize maxSize = CGRectInset(self.view.bounds, 
             [mapViewController annotationPadding], 
             [mapViewController annotationPadding]).size; 
      maxSize.height -= self.navigationController.navigationBar.frame.size.height + [mapViewController calloutHeight]; 
      if (resizeRect.size.width > maxSize.width) 
       resizeRect.size = CGSizeMake(maxSize.width, resizeRect.size.height/resizeRect.size.width * maxSize.width); 
      if (resizeRect.size.height > maxSize.height) 
       resizeRect.size = CGSizeMake(resizeRect.size.width/resizeRect.size.height * maxSize.height, maxSize.height); 

      resizeRect.origin = (CGPoint){0.0f, 0.0f}; 
      UIGraphicsBeginImageContext(resizeRect.size); 
      [academicImage drawInRect:resizeRect]; 
      UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext(); 
      UIGraphicsEndImageContext(); 

      annotationView.image = resizedImage; 
      annotationView.opaque = NO; 

      UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
      NSInteger annotationValue = [self.mapAnnotations indexOfObject:annotation]; 
      rightButton.tag = annotationValue; 
      [rightButton addTarget:self action:@selector(showDetails:) forControlEvents:UIControlEventTouchUpInside]; 
      annotationView.rightCalloutAccessoryView = rightButton; 

      return annotationView; 
     } 
     else 
     { 
      pinView.annotation = annotation; 
     } 
     return pinView; 
    } 

    else if([[annotation subtitle] isEqualToString:@"Administrative"]) 
    { 
     // try to dequeue an existing pin view first 
     static NSString* annotationIdentifier = @"annotationIdentifier"; 
     MKPinAnnotationView* pinView = (MKPinAnnotationView *)[theMapView dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier]; 

     if (!pinView) 
     { 
      MKAnnotationView *annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation 
                      reuseIdentifier:annotationIdentifier] autorelease]; 
      annotationView.canShowCallout = YES; 

      UIImage *administrativeImage = [UIImage imageNamed:@"administrative.png"]; 

      CGRect resizeRect; 

      resizeRect.size = administrativeImage.size; 
      CGSize maxSize = CGRectInset(self.view.bounds, 
             [mapViewController annotationPadding], 
             [mapViewController annotationPadding]).size; 
      maxSize.height -= self.navigationController.navigationBar.frame.size.height + [mapViewController calloutHeight]; 
      if (resizeRect.size.width > maxSize.width) 
       resizeRect.size = CGSizeMake(maxSize.width, resizeRect.size.height/resizeRect.size.width * maxSize.width); 
      if (resizeRect.size.height > maxSize.height) 
       resizeRect.size = CGSizeMake(resizeRect.size.width/resizeRect.size.height * maxSize.height, maxSize.height); 

      resizeRect.origin = (CGPoint){0.0f, 0.0f}; 
      UIGraphicsBeginImageContext(resizeRect.size); 
      [administrativeImage drawInRect:resizeRect]; 
      UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext(); 
      UIGraphicsEndImageContext(); 

      annotationView.image = resizedImage; 
      annotationView.opaque = NO; 

      UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
      NSInteger annotationValue = [self.mapAnnotations indexOfObject:annotation]; 
      rightButton.tag = annotationValue; 
      [rightButton addTarget:self action:@selector(showDetails:) forControlEvents:UIControlEventTouchUpInside]; 
      annotationView.rightCalloutAccessoryView = rightButton; 

      return annotationView; 
     } 
     else 
     { 
      pinView.annotation = annotation; 
     } 
     return pinView; 
    } 

    else if([[annotation subtitle] isEqualToString:@"University Housing"] || [[annotation subtitle] isEqualToString:@"Residence Halls"] || [[annotation subtitle] isEqualToString:@"University Duplexes"] || [[annotation subtitle] isEqualToString:@"Greek Housing"]) 
    { 
     // try to dequeue an existing pin view first 
     static NSString* annotationIdentifier = @"annotationIdentifier"; 
     MKPinAnnotationView* pinView = (MKPinAnnotationView *)[theMapView dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier]; 

     if (!pinView) 
     { 
      MKAnnotationView *annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation 
                      reuseIdentifier:annotationIdentifier] autorelease]; 
      annotationView.canShowCallout = YES; 

      UIImage *housingImage = [UIImage imageNamed:@"housing.png"]; 

      CGRect resizeRect; 

      resizeRect.size = housingImage.size; 
      CGSize maxSize = CGRectInset(self.view.bounds, 
             [mapViewController annotationPadding], 
             [mapViewController annotationPadding]).size; 
      maxSize.height -= self.navigationController.navigationBar.frame.size.height + [mapViewController calloutHeight]; 
      if (resizeRect.size.width > maxSize.width) 
       resizeRect.size = CGSizeMake(maxSize.width, resizeRect.size.height/resizeRect.size.width * maxSize.width); 
      if (resizeRect.size.height > maxSize.height) 
       resizeRect.size = CGSizeMake(resizeRect.size.width/resizeRect.size.height * maxSize.height, maxSize.height); 

      resizeRect.origin = (CGPoint){0.0f, 0.0f}; 
      UIGraphicsBeginImageContext(resizeRect.size); 
      [housingImage drawInRect:resizeRect]; 
      UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext(); 
      UIGraphicsEndImageContext(); 

      annotationView.image = resizedImage; 
      annotationView.opaque = NO; 

      UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
      NSInteger annotationValue = [self.mapAnnotations indexOfObject:annotation]; 
      rightButton.tag = annotationValue; 
      [rightButton addTarget:self action:@selector(showDetails:) forControlEvents:UIControlEventTouchUpInside]; 
      annotationView.rightCalloutAccessoryView = rightButton; 

      return annotationView; 
     } 
     else 
     { 
      pinView.annotation = annotation; 
     } 
     return pinView; 
    } 

    else if([[annotation subtitle] isEqualToString:@"Other"]) 
    { 
     // try to dequeue an existing pin view first 
     static NSString* annotationIdentifier = @"annotationIdentifier"; 
     MKPinAnnotationView* pinView = (MKPinAnnotationView *)[theMapView dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier]; 

     if (!pinView) 
     { 
      MKAnnotationView *annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation 
                      reuseIdentifier:annotationIdentifier] autorelease]; 
      annotationView.canShowCallout = YES; 

      UIImage *otherImage = [UIImage imageNamed:@"other.png"]; 

      CGRect resizeRect; 

      resizeRect.size = otherImage.size; 
      CGSize maxSize = CGRectInset(self.view.bounds, 
             [mapViewController annotationPadding], 
             [mapViewController annotationPadding]).size; 
      maxSize.height -= self.navigationController.navigationBar.frame.size.height + [mapViewController calloutHeight]; 
      if (resizeRect.size.width > maxSize.width) 
       resizeRect.size = CGSizeMake(maxSize.width, resizeRect.size.height/resizeRect.size.width * maxSize.width); 
      if (resizeRect.size.height > maxSize.height) 
       resizeRect.size = CGSizeMake(resizeRect.size.width/resizeRect.size.height * maxSize.height, maxSize.height); 

      resizeRect.origin = (CGPoint){0.0f, 0.0f}; 
      UIGraphicsBeginImageContext(resizeRect.size); 
      [otherImage drawInRect:resizeRect]; 
      UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext(); 
      UIGraphicsEndImageContext(); 

      annotationView.image = resizedImage; 
      annotationView.opaque = NO; 

      UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
      NSInteger annotationValue = [self.mapAnnotations indexOfObject:annotation]; 
      rightButton.tag = annotationValue; 
      [rightButton addTarget:self action:@selector(showDetails:) forControlEvents:UIControlEventTouchUpInside]; 
      annotationView.rightCalloutAccessoryView = rightButton; 

      return annotationView; 
     } 
     else 
     { 
      pinView.annotation = annotation; 
     } 
     return pinView; 
    } 

    else if([[annotation subtitle] isEqualToString:@"Fields"]) 
    { 
     // try to dequeue an existing pin view first 
     static NSString* annotationIdentifier = @"annotationIdentifier"; 
     MKPinAnnotationView* pinView = (MKPinAnnotationView *)[theMapView dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier]; 

     if (!pinView) 
     { 
      MKAnnotationView *annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation 
                      reuseIdentifier:annotationIdentifier] autorelease]; 
      annotationView.canShowCallout = YES; 

      UIImage *athleticsImage = [UIImage imageNamed:@"athletics.png"]; 

      CGRect resizeRect; 

      resizeRect.size = athleticsImage.size; 
      CGSize maxSize = CGRectInset(self.view.bounds, 
             [mapViewController annotationPadding], 
             [mapViewController annotationPadding]).size; 
      maxSize.height -= self.navigationController.navigationBar.frame.size.height + [mapViewController calloutHeight]; 
      if (resizeRect.size.width > maxSize.width) 
       resizeRect.size = CGSizeMake(maxSize.width, resizeRect.size.height/resizeRect.size.width * maxSize.width); 
      if (resizeRect.size.height > maxSize.height) 
       resizeRect.size = CGSizeMake(resizeRect.size.width/resizeRect.size.height * maxSize.height, maxSize.height); 

      resizeRect.origin = (CGPoint){0.0f, 0.0f}; 
      UIGraphicsBeginImageContext(resizeRect.size); 
      [athleticsImage drawInRect:resizeRect]; 
      UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext(); 
      UIGraphicsEndImageContext(); 

      annotationView.image = resizedImage; 
      annotationView.opaque = NO; 

      UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
      NSInteger annotationValue = [self.mapAnnotations indexOfObject:annotation]; 
      rightButton.tag = annotationValue; 
      [rightButton addTarget:self action:@selector(showDetails:) forControlEvents:UIControlEventTouchUpInside]; 
      annotationView.rightCalloutAccessoryView = rightButton; 

      return annotationView; 
     } 
     else 
     { 
      pinView.annotation = annotation; 
     } 
     return pinView; 
    } 

    else if([[annotation subtitle] isEqualToString:@"Landmarks"]) 
    { 
     // try to dequeue an existing pin view first 
     static NSString* annotationIdentifier = @"annotationIdentifier"; 
     MKPinAnnotationView* pinView = (MKPinAnnotationView *)[theMapView dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier]; 

     if (!pinView) 
     { 
      MKAnnotationView *annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation 
                      reuseIdentifier:annotationIdentifier] autorelease]; 
      annotationView.canShowCallout = YES; 

      UIImage *landmarkImage = [UIImage imageNamed:@"landmark.png"]; 

      CGRect resizeRect; 

      resizeRect.size = landmarkImage.size; 
      CGSize maxSize = CGRectInset(self.view.bounds, 
             [mapViewController annotationPadding], 
             [mapViewController annotationPadding]).size; 
      maxSize.height -= self.navigationController.navigationBar.frame.size.height + [mapViewController calloutHeight]; 
      if (resizeRect.size.width > maxSize.width) 
       resizeRect.size = CGSizeMake(maxSize.width, resizeRect.size.height/resizeRect.size.width * maxSize.width); 
      if (resizeRect.size.height > maxSize.height) 
       resizeRect.size = CGSizeMake(resizeRect.size.width/resizeRect.size.height * maxSize.height, maxSize.height); 

      resizeRect.origin = (CGPoint){0.0f, 0.0f}; 
      UIGraphicsBeginImageContext(resizeRect.size); 
      [landmarkImage drawInRect:resizeRect]; 
      UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext(); 
      UIGraphicsEndImageContext(); 

      annotationView.image = resizedImage; 
      annotationView.opaque = NO; 

      UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
      NSInteger annotationValue = [self.mapAnnotations indexOfObject:annotation]; 
      rightButton.tag = annotationValue; 
      [rightButton addTarget:self action:@selector(showDetails:) forControlEvents:UIControlEventTouchUpInside]; 
      annotationView.rightCalloutAccessoryView = rightButton; 

      return annotationView; 
     } 
     else 
     { 
      pinView.annotation = annotation; 
     } 
     return pinView; 
    } 

    return nil; 
} 

#pragma mark <mapParser> Implementation 

- (void)parser:(NSXMLParser *)parser didFailWithError:(NSError *)parseError { 

} 

- (void)parserDidEndParsingData:(mapParser *)parser 
{ 
    [self addAnnotation]; 

    tabView.mapAnnotations2 = mapAnnotations; 

    self.mParser = nil; 
    [mParser release]; 
} 

- (void)parser:(mapParser *)parser didParseItem:(NSArray *)parsedItem 
{ 
    NSLog(@"Did Parse Map Item"); 

    [self.mapAnnotations addObjectsFromArray:parsedItem]; 
} 

- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error {} 
- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark {} 

@end 
+0

sprawdź moją odpowiedź Mam rozwiązać ten problem [tutaj] (http://stackoverflow.com/questions/2931457/iphone-sdk-linking-errors-with-static-library/ 12276904 # 12276904) – swiftBoy

Odpowiedz

29

Najprawdopodobniej tych trzech klas brakuje w pliku projektu. Sprawdź grupę Classes w swoim projekcie XCode, aby zobaczyć, czy te trzy pliki są obecne. Jeśli nie, kliknij prawym przyciskiem myszy grupę Klasy i kliknij Dodaj> Istniejące pliki, aby je dodać.

Jeśli pliki zostaną dodane do projektu, upewnij się, że pliki implementacji (.m) dla tych brakujących klas zostały dodane do skompilowanych źródeł. Aby to sprawdzić, rozwiń grupę Targets > your application target > Compile Sources i zobacz, czy pliki są obecne. Jeśli nie, kliknij prawym przyciskiem myszy "Kompiluj źródła", a następnie dodaj je do Add > Existing Files. Alternatywnym i być może szybszym sposobem na to samo jest wybranie plików .m dla każdej z brakujących klas i sprawdzenie, czy pole wyboru "byki" z prawej strony jest zaznaczone. Jeśli nie, sprawdź to, a zostanie automatycznie dodane do Źródeł skompilowanych.

+2

podczas gdy to nie było dokładnie to, co było nie tak, doprowadziłeś mnie we właściwym kierunku = D. Dodałem już pliki klas, ale na liście klas znajduje się docelowy wiersz pól wyboru, a pola dla tych klas zostały odznaczone. Nie wiedziałem nawet, że istniało do tej pory lol ... dzięki za pomoc! – ReCon11

+0

doskonały. cieszę się, że wszystko gotowe do rozpoczęcia kodowania :). dla sake kompletności i innych użytkowników, którzy mogą mieć ten sam problem, zaktualizuję tę odpowiedź. – Anurag

1

miałem ten sam problem, który ja rozwiązany przez dodanie ram do Xcode

+0

Zrobiłem dokładnie odwrotnie i zadziałało to dla mnie. Nie wiem, jak Xcode zawiera te błędy ... :) – penatheboss

0

podczas dodawania CoreGraphics libraray.you trzeba wybrać project_name-> cele/wybierz nazwę projektu (nie wybrać nazwę testu projekt, jego błąd w twarz) -> buildsetting-> i dodać CoreLocation.framework

0

"_OBJC_CLASS _ $ _ mapListViewController", odwołuje się od: objc-klasa-ref-do-mapListViewController w mapViewController.o

„_OBJC_CLASS_ $ _mapParser ", referen ced from: objc-class-ref-to-mapParser na mapieViewController.O

"_OBJC_CLASS _ $ _ mapTabViewController", odwołuje się od: objc-klasa-ref-do-mapTabViewController w mapViewController.o

ld: symbol (s) Nie znaleziono collect2: ld zwróconym 1 status wyjścia

Upewnij wszystko (mapListViewController, mapParser, mapTabViewController) mają zarówno @interface & @implementation

to rozwiązać mój problem. nie udało mi się przegapić @implementation brakuje

Powiązane problemy