2012-03-27 85 views
6

似乎我在嘗試編譯時出現錯誤,它似乎直接指向兩個文件..MenuViewController和FirstTopViewController。我認爲它與我的導入有關,因爲它們中的每一個都導入另一個導入,但是錯誤引用了我的Building對象,而這個對象幾乎沒有用到。此外,隨着鐺錯誤,我該如何使用-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 2012-03-27 00:25:02

+1

我有Building.h,BuildingAnnotation.h和BuildingViewController.m/h。有沒有辦法清除編譯列表並讓Xcode重新生成它? – 2012-03-27 00:26:23

+1

清除您的編譯列表,然後當您添加所有內容時,搜索術語「.m」(不含引號),並突出顯示每個.m文件。然後點擊添加。 – CodaFi 2012-03-27 00:30:47

回答

17

按照您的要求:

刪除所有的類都是從編譯源,然後單擊+按鈕和搜索術語「.M」。突出顯示每個班級,然後點擊添加。重新構建並運行。

+0

沒有爲我工作:( – NightFury 2012-11-24 12:40:44

+0

iAnum檢查你的@implementation行是否有正確的名稱 – 2014-08-14 18:53:06

+2

我能夠進入編譯源的特定文件,抱怨重複的符號。刪除它,並重新添加它和它工作的基本上與這個答案一樣,沒有轟炸整個事情 – teradyl 2016-04-18 17:15:48

1

不知道,但有幾件事情,它可能是。

  1. 我注意到這兩個類都沒有導入Building.h,所以我的第一個想法是編譯器不知道從哪裏得到這個類的信息。你需要添加一個#import嗎?

  2. 接下來的事情是,我通常會盡量避免有兩個相互導入的類。編譯時可能會遇到問題,試圖找出編譯它們的順序。您可能需要將其中的一個更改爲使用@class ...而不是#import ...,以便編譯器將其留在運行時解析該類。

  3. 終於,你做了乾淨?有時,重構很多時候,舊的類定義會留在構建目錄中,並可能導致類似的問題。

23

檢查是否沒有導入.m文件,它應該是.h文件。衛生署!

+1

完美的加法,謝謝。 – 2015-02-04 06:52:22

+0

驚人的!我瘋了,永遠不會看到這麼緊密 – IMFletcher 2016-02-24 02:45:27

1

刪除文件並選擇「刪除參考」。將文件再次拖回到項目,它應該沒問題。這對我有效。

1

導致此問題的原因是我複製了一個m文件,但未重命名@implementation。確保你沒有重複的@implementation聲明。

1

我有一個類似的錯誤導入第三方庫與多個* .a文件到我的IOS項目。 在我的情況下,刪除'-all_load'鏈接器標誌解決了這個問題。

+0

這擺脫了我的大部分副本。還剩4個。 – 2017-12-20 23:05:11

相關問題