2012-03-27 3 views
6

Кажется, что я пытаюсь скомпилировать ошибку и, кажется, указывая на два файла напрямую: MenuViewController и FirstTopViewController. Я думаю, что это имеет какое-то отношение к моему импорту, поскольку каждый из них импортирует другой, однако ошибка ссылается на мой объект Building, который почти не используется в нем. Кроме того, с ошибкой clang, как использовать -v для просмотра вызова?iOS - Ошибка компоновщика, повторяющийся символ

Ошибка:

ld: duplicate symbol _OBJC_CLASS_$_Building in /Users/alexmuller/Library/Developer/Xcode/DerivedData/ECSlidingViewController-gjxwxiwumgohyehiawnlamggzmop/Build/Intermediates/ECSlidingViewController.build/Debug-iphonesimulator/ECSlidingViewController.build/Objects-normal/i386/FirstTopViewController.o and /Users/alexmuller/Library/Developer/Xcode/DerivedData/ECSlidingViewController-gjxwxiwumgohyehiawnlamggzmop/Build/Intermediates/ECSlidingViewController.build/Debug-iphonesimulator/ECSlidingViewController.build/Objects-normal/i386/MenuViewController.o for architecture i386 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

FirstTopViewController.h

#import <UIKit/UIKit.h> 
#import <QuartzCore/QuartzCore.h> 
#import "ECSlidingViewController.h" 
#import "MenuViewController.h" 
#import "TimesViewController.h" 
#import "BuildingViewController.h" 
#import "BuildingAnnotation.h" 
#import <MapKit/MapKit.h> 

@class BuildingViewController; 

@interface FirstTopViewController : UIViewController <MKMapViewDelegate> { 
    IBOutlet MKMapView *_map; 
    BuildingViewController *buildingVC; 
    BuildingAnnotation *buildAnnotation; 
} 

@property (nonatomic, strong) MKMapView *map; 

- (IBAction)revealMenu:(id)sender; 
- (IBAction)revealTimes:(id)sender; 
- (void)loadBuilding:(Building *)building; 

@end 

FirstTopViewController.m

#import "FirstTopViewController.h" 

@implementation FirstTopViewController 

@synthesize map = _map; 

- (void)viewDidLoad { 

    buildingVC = (BuildingViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"BuildingList"]; 
    [super viewDidLoad]; 
} 

- (void)viewWillAppear:(BOOL)animated 
{ 
    [(UIView *)[self.view viewWithTag:10] setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"RedWithNoise"]]]; 
    [super viewWillAppear:animated]; 
    [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"toolbar"] forBarMetrics:UIBarMetricsDefault]; 
    [[UINavigationBar appearance] setTitleTextAttributes: 
    [NSDictionary dictionaryWithObjectsAndKeys: 
     [UIColor colorWithRed:204.0/255.0 green:204.0/255.0 blue:102.0/255.0 alpha:1.0], 
     UITextAttributeTextColor, 
     [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8], 
     UITextAttributeTextShadowColor, 
     [NSValue valueWithUIOffset:UIOffsetMake(0, -1)], 
     UITextAttributeTextShadowOffset, 
     [UIFont fontWithName:@"AGaramondPro-Regular" size:23.0], 
     UITextAttributeFont, 
     nil]]; 
    self.view.layer.shadowOffset = CGSizeZero; 
    self.view.layer.shadowOpacity = 0.75f; 
    self.view.layer.shadowRadius = 10.0f; 
    self.view.layer.shadowColor = [UIColor blackColor].CGColor; 
    self.view.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.view.layer.bounds].CGPath; 
    self.view.clipsToBounds = NO; 

    MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(CLLocationCoordinate2DMake(30.451667, -84.268533), 16090.344, 16090.344); 
    viewRegion = [_map regionThatFits:viewRegion]; 
    [_map setRegion:viewRegion animated:YES]; 

    if (![self.slidingViewController.underLeftViewController isKindOfClass:[MenuViewController class]]) { 
     self.slidingViewController.underLeftViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"Menu"]; 
    } 

    if (![self.slidingViewController.underRightViewController isKindOfClass:[TimesViewController class]]) { 
     self.slidingViewController.underRightViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"Times"]; 
    } 

    [self.view addGestureRecognizer:self.slidingViewController.panGesture]; 


} 

- (void)loadBuilding:(Building *)building { 
    if (buildingVC.buildingSelected) { 
     if (buildAnnotation != nil) { 
      [_map removeAnnotation:buildAnnotation]; 
     } 
     NSLog(@"%@", building.getName); 
     buildAnnotation = [[BuildingAnnotation alloc] initWithCoordinate:building.getLocation.coordinate withName:building.getName withAddress:building.getAddress]; 
     [_map setCenterCoordinate:buildAnnotation.coordinate animated:YES]; 
     [_map addAnnotation:buildAnnotation]; 
    } 
} 

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 
    self.view.layer.shadowPath = nil; 
    self.view.layer.shouldRasterize = YES; 
} 

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
{ 
    self.view.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.view.layer.bounds].CGPath; 
    self.view.layer.shouldRasterize = NO; 
} 

- (IBAction)revealMenu:(id)sender 
{ 
    [self.slidingViewController anchorTopViewTo:ECRight]; 
} 

- (IBAction)revealTimes:(id)sender { 
    [self.slidingViewController anchorTopViewTo:ECLeft]; 
} 

@end 

MenuViewController.h

#import <UIKit/UIKit.h> 
#import "ECSlidingViewController.h" 
#import "FirstTopViewController.h" 
#import "TimesViewController.h" 

@interface MenuViewController : UIViewController <UITableViewDataSource, UITabBarControllerDelegate> { 
    NSIndexPath *selectedIndex; 
} 

@end 

MenuViewController.m

#import "MenuViewController.h" 

typedef enum { 
    ENGINEERING, 
    GARNET, 
    GOLD, 
    HERITAGE, 
    NIGHT, 
    OSCEOLA, 
    RENEGADE, 
    TOMAHAWK 
} RouteName; 


@interface MenuViewController() 
@property (nonatomic, strong) NSArray *menuItems; 
@property (nonatomic, strong) NSArray *optionItems; 
@property (nonatomic, strong) NSArray *arrayItems; 

- (UIImage *)determineActiveRoute:(RouteName)route; 
@end 

@implementation MenuViewController 
@synthesize menuItems, optionItems, arrayItems; 

- (void)awakeFromNib 
{ 

    self.menuItems = [NSArray arrayWithObjects:@"Engineering", @"Garnet", @"Gold", @"Heritage Grove", @"Night Nole", @"Osceola", @"Renegade", @"Tomahawk", nil]; 
    self.optionItems = [NSArray arrayWithObjects:@"Buildings", @"Directions", nil]; 
    self.arrayItems = [NSArray arrayWithObjects:self.menuItems, self.optionItems, nil]; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self.slidingViewController setAnchorRightRevealAmount:200.0f]; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)sectionIndex 
{ 
    return [[self.arrayItems objectAtIndex:sectionIndex] count]; 
} 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return [self.arrayItems count]; 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    return 35; 
} 

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 
    UIView *sectionView = [[UIView alloc] init]; 
    [sectionView sizeToFit]; 
    sectionView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"navCellDivider"]]; 
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(5, 5, 100, 20)]; 
    label.textColor = [UIColor grayColor]; 
    label.backgroundColor = [UIColor clearColor]; 
    label.font = [UIFont fontWithName:@"AGaramondPro-Regular" size:12.0]; 
    if(section == 0) 
     label.text = @"BUS ROUTES"; 
    else 
     label.text = @"OTHER OPTIONS"; 
    [sectionView addSubview:label]; 
    return sectionView; 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { 
    return 20; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UILabel *label; 
    UIImageView *imageView; 
    NSString *cellIdentifier = @"MenuItemCell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; 

    } 
    UIView *selectedView = [[UIView alloc] initWithFrame:cell.frame]; 
    selectedView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"navCellBackgroundSelected"]]; 
    cell.selectedBackgroundView = selectedView; 
    cell.contentView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"navCellBackground"]]; 
    label = (UILabel *)[cell.contentView viewWithTag:100]; 
    label.font = [UIFont fontWithName:@"AGaramondPro-Regular" size:15.0]; 
    label.text = [[self.arrayItems objectAtIndex:indexPath.section] objectAtIndex:indexPath.row]; 
    imageView = (UIImageView *)[cell.contentView viewWithTag:101]; 
    if (indexPath.section == 0) { 
     [imageView setImage:[self determineActiveRoute:indexPath.row]]; 
    } else { 
     if (indexPath.row == 0) { 
      [imageView setImage:[UIImage imageNamed:@"building"]]; 
     } else { 
      [imageView setImage:[UIImage imageNamed:@"60-signpost"]]; 
     } 
    } 

    return cell; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    /* Type cast view as a First Top to make it easier to read. Do switch to select correct route, 
     then modify map afterwards to load up correct route. 
    TimesViewController can be set to the corresponding times when selected 
    */ 
    FirstTopViewController *mapViewController = (FirstTopViewController *)self.slidingViewController.topViewController; 
    TimesViewController *timesViewController = (TimesViewController *)self.slidingViewController.underRightViewController; 

    if (indexPath.section == 0) { 
     selectedIndex = indexPath; 
     switch (indexPath.row) { 
      case ENGINEERING: 
       NSLog(@"Engineering Selected\n"); 
       timesViewController.times.text = @"Engineering"; 
       break; 
      case GARNET: 
       NSLog(@"Garnet Selected\n"); 
       timesViewController.times.text = @"Garnet"; 
       break; 
      case GOLD: 
       NSLog(@"Gold Selected\n"); 
       timesViewController.times.text = @"Gold"; 
       break; 
      case HERITAGE: 
       NSLog(@"Heritage Grove Selected\n"); 
       timesViewController.times.text = @"Heritage Grove"; 
       break; 
      case NIGHT: 
       NSLog(@"Night Nole Selected\n"); 
       timesViewController.times.text = @"Night Nole"; 
       break; 
      case OSCEOLA: 
       NSLog(@"Osceola Selected\n"); 
       timesViewController.times.text = @"Osceola"; 
       break; 
      case RENEGADE: 
       NSLog(@"Renegade Selected\n"); 
       timesViewController.times.text = @"Renegade"; 
       break; 
      case TOMAHAWK: 
       NSLog(@"Tomahawk Selected\n"); 
       timesViewController.times.text = @"Tomahawk"; 
       break; 
      default: 
       break; 
     } 
    } else { 
     if (indexPath.row == 0) { 
      BuildingViewController *buildings = [self.storyboard instantiateViewControllerWithIdentifier:@"BuildingList"]; 
      buildings.userLoc = [[CLLocation alloc] initWithLatitude:mapViewController.map.userLocation.coordinate.latitude longitude:mapViewController.map.userLocation.coordinate.longitude]; 

      [self presentModalViewController:buildings animated:YES]; 
     } 
     [tableView deselectRowAtIndexPath:indexPath animated:NO]; 
     [tableView selectRowAtIndexPath:selectedIndex animated:YES scrollPosition:UITableViewScrollPositionNone]; 
    } 
    [self.slidingViewController anchorTopViewTo:ECRight animations:nil onComplete:^{ 
     [self.slidingViewController resetTopView]; 
    }]; 
} 

- (UIImage *)determineActiveRoute:(RouteName)route { 
    NSCalendar *gregorianCalender = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
    NSDateComponents *components = [gregorianCalender components:NSHourCalendarUnit fromDate:[NSDate date]]; 
    switch (route) { 
     case ENGINEERING: 
      if ([components day] % 7 == 2) { 
       if (([components hour] >= 7) && ([components hour] < 17)) { 
        return [UIImage imageNamed:@"green"]; 
       } else { 
        return [UIImage imageNamed:@"red"]; 
       } 
      } else if (([components day] % 7 == 3) || ([components day] % 7 == 4)) { 
       return [UIImage imageNamed:@"red"]; 
      } else { 
       //Weekday 
       if (([components hour] >= 7) && ([components hour] < 19)) { 
        return [UIImage imageNamed:@"green"]; 
       } else { 
        return [UIImage imageNamed:@"red"]; 
       } 
      } 
      break; 
     case GARNET: 
     case GOLD: 
     case HERITAGE: 
      if ((([components day] % 7 <= 3) || ([components day] % 7 >= 5)) && 
       (([components hour] >= 7) && ([components hour] <= 19))) { 
       return [UIImage imageNamed:@"green"]; 
      } else { 
       return [UIImage imageNamed:@"red"]; 
      } 
      break; 
     case NIGHT: 
      if ((([components day] % 7 == 6) || ([components day] % 7 <= 3)) && 
       (([components hour] >= 22.5) || ([components hour] <= 3))) { 
       return [UIImage imageNamed:@"green"]; 
      } else { 
       return [UIImage imageNamed:@"red"]; 
      } 
      break; 
     case OSCEOLA: 
     case RENEGADE: 
     case TOMAHAWK: 
      if ((([components day] % 7 <= 3) || ([components day] % 7 >= 5)) && 
       (([components hour] >= 7) && ([components hour] <= 19))) { 
       return [UIImage imageNamed:@"green"]; 
      } else { 
       return [UIImage imageNamed:@"red"]; 
      } 
      break; 
    } 
} 

@end 
+1

Дублирующиеся символы означают, что у вас есть два класса с именем «Builder» в вашем проекте или список компиляции. – CodaFi

+1

У меня есть Building.h, BuildingAnnotation.h и BuildingViewController.m/h.Есть ли способ очистить список компиляции и восстановить его Xcode? –

+1

Очистите свой список компиляции, затем, когда вы переходите, чтобы добавить все обратно, найдите термин «.m» (без кавычек) и выделите каждый файл .m. затем нажмите «Добавить». – CodaFi

ответ

17

По вашему запросу:

Удалить все ваши классы из компиляции источников, а затем нажмите кнопку + и поиск термина «.m». Выделите каждый класс и нажмите «Добавить». Сборка и запуск снова.

+0

Не работает для меня :( – NightFury

+0

iAnum проверяет, что у вас @implementation строка имеет правильное имя –

+2

Мне удалось перейти к компиляции источников в конкретный файл, который жаловался на дубликаты символов. Удалили его и повторно добавили, и он работала.На самом деле, такой же, как этот ответ, без бомбардировки всей вещи. – teradyl

1

Не уверен, но есть несколько вещей, которые она могла бы быть.

  1. Я заметил, что ни один класс, как представляется, импортировать Building.h поэтому моя первая мысль о том, что компилятор не знает, где можно получить информацию для этого класса. Вам нужно добавить #import?

  2. Следующее, что я обычно стараюсь избегать наличия двух классов, которые импортируют друг друга. У компилятора могут возникнуть проблемы с попыткой определить, в каком порядке их компилировать. Возможно, вам придется изменить один из них, чтобы использовать @class ..., а не #import ..., чтобы компилятор оставил его до выполнения во время выполнения класса.

  3. Наконец, вы сделали чистую? Несколько раз, когда рефакторинг много, старые определения классов остаются в каталогах сборки и могут вызвать такие проблемы.

23

Убедитесь, что вы не импортировали файл .m, где он должен быть .h-файлом. Doh!

+1

Отличное дополнение, спасибо. –

+0

потрясающе! Я сходил с ума и никогда бы не посмотрел достаточно близко для этого – IMFletcher

1

Удалить файл и выбрать «Удалить ссылку». Перетащите файл обратно в проект, и все будет хорошо. Это сработало для меня.

1

Проблема, которая вызывала это для меня, заключалась в том, что я дублировал файл m, но не переименовал @implementation. Убедитесь, что у вас нет повторяющихся объявлений @implementation.

1

У меня была подобная ошибка при импорте библиотеки сторонних разработчиков с несколькими * .a файлами в проект IOS. В моем случае удаление флажка компоновщика '-all_load' решило проблему.

+0

Это избавило меня от большинства моих дубликатов. Все еще осталось 4. –

Смежные вопросы