2013-04-25 61 views
1

以下是代碼。我嘗試創建一個包含名稱,大小和圖像的對象(從資源獲取),然後將該對象添加到NSMutableArray中,以便在NSTableView中顯示這些對象。然而,在我運行代碼之後,我確實得到了NSMutableArray中正確的對象計數和每個對象(名稱,大小,圖像)中的正確信息,但它仍然給我錯誤。你們能幫助我嗎?我是一名新的Mac開發人員。謝謝 !!執行後出現錯誤NSMutableArray

下面是代碼:

@implementation AppDelegate{ 
     NSMutableArray* _tableContents; 
    } 

    -(void)awakeFromNib{ 

     NSString* imagePath = @"USB.png"; 
     NSString* mountPath = @"/Volumes"; 

     _tableContents = [[NSMutableArray alloc]init]; 

     for(mountPath in [[NSWorkspace sharedWorkspace]mountedLocalVolumePaths]) 
     { 
     if(0==[mountPath rangeOfString:@"/Volumes/"].location) 
     {    

      NSString* USBpath = [[[NSWorkspace sharedWorkspace]mountedLocalVolumePaths]objectAtIndex:count]; 

      //get the name of USB drive 
      NSString* nameOfUSB = [USBpath substringFromIndex:9]; 

      //get the size of USB drive 
      NSNumber *volumeSize; 
      NSURL *mountPathPicked = [NSURL fileURLWithPath:mountPath]; 

      if([mountPathPicked getResourceValue:&volumeSize forKey:NSURLVolumeTotalCapacityKey error:nil]) 
      { 
      NSDictionary *obj = @{@"name":nameOfUSB, 
            @"image":[NSImage imageNamed:imagePath], 
            @"size":volumeSize 
            }; 

      //after I call the following line, it will give me error !! 
      [_tableContents addObject:obj]; 
      } 
     } 
     count ++; 
     } 
    } 

//I also use the following two methods in order to show the name, and image in NSTableView 
-(NSInteger)numberOfRowsInTableView:(NSTableView *)tableView{ 
    return [_tableCountents count]; 
} 

-(NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row{ 

    NSDictionary *flag = _tableContents[row]; 
    NSString *identifier = [tableColumn identifier];//call different col we need identifier 
    if([identifier isEqualToString:@"MainCell"]) 
    { 
     NSTableCellView *cellView = [tableView makeViewWithIdentifier:@"MainCell" owner:self];//give back specific cell named mainCell 
     [cellView.textField setStringValue:flag[@"name"]]; 
     [cellView.imageView setImage:flag[@"image"]]; 
     return cellView; 
    } 
    return nil; 
} 

有一個在GUI中沒有連接問題。這裏是錯誤信息:

2013-04-25 01:16:41.321 NAMEOFPROJECT[8243:303] An uncaught exception was raised 
2013-04-25 01:16:41.322 NAMEOFPROJECT[8243:303] *** -[__NSArrayI objectAtIndex:]: index 7 beyond bounds [0 .. 3] 
2013-04-25 01:16:41.329 NAMEOFPROJECT[8243:303] (
0 CoreFoundation      0x00007fff9147cb06 __exceptionPreprocess + 198 
1 libobjc.A.dylib      0x00007fff900c03f0 objc_exception_throw + 43 
2 CoreFoundation      0x00007fff9142fb53 -[__NSArrayI objectAtIndex:] + 163 
3 CDTOANYDRIVE      0x00000001000011d6 -[AppDelegate DetectingUSBDrives] + 710 
4 CDTOANYDRIVE      0x0000000100000efb -[AppDelegate awakeFromNib] + 43 
5 AppKit        0x00007fff899631a8 -[NSIBObjectData nibInstantiateWithOwner:topLevelObjects:] + 1234 
6 AppKit        0x00007fff89b79976 -[NSNib _instantiateNibWithExternalNameTable:] + 610 
7 AppKit        0x00007fff89b7a41a -[NSNib instantiateNibWithExternalNameTable:] + 17 
8 AppKit        0x00007fff89b262b4 -[NSTableRowData _unarchiveViewWithIdentifier:owner:] + 520 
9 CDTOANYDRIVE      0x000000010000174b -[AppDelegate tableView:viewForTableColumn:row:] + 219 
10 AppKit        0x00007fff89b279a2 -[NSTableRowData _addViewToRowView:atColumn:row:] + 324 
11 AppKit        0x00007fff89b2766f -[NSTableRowData _addViewsToRowView:atRow:] + 151 
12 AppKit        0x00007fff89b25c05 -[NSTableRowData _addRowViewForVisibleRow:withPriorView:] + 415 
13 AppKit        0x00007fff89b2598a -[NSTableRowData _addRowViewForVisibleRow:withPriorRowIndex:inDictionary:withRowAnimation:] + 272 
14 AppKit        0x00007fff89b24c59 -[NSTableRowData _unsafeUpdateVisibleRowEntries] + 740 
15 AppKit        0x00007fff89b247f1 -[NSTableRowData updateVisibleRowViews] + 119 
16 AppKit        0x00007fff89afc5d7 -[NSTableView layout] + 165 
17 AppKit        0x00007fff89aafe95 -[NSView _layoutSubtreeHeedingRecursionGuard:] + 112 
18 CoreFoundation      0x00007fff914754a6 __NSArrayEnumerate + 582 
19 AppKit        0x00007fff89aafff6 -[NSView _layoutSubtreeHeedingRecursionGuard:] + 465 
20 CoreFoundation      0x00007fff914754a6 __NSArrayEnumerate + 582 
21 AppKit        0x00007fff89aafff6 -[NSView _layoutSubtreeHeedingRecursionGuard:] + 465 
22 CoreFoundation      0x00007fff914754a6 __NSArrayEnumerate + 582 
23 AppKit        0x00007fff89aafff6 -[NSView _layoutSubtreeHeedingRecursionGuard:] + 465 
24 CoreFoundation      0x00007fff914754a6 __NSArrayEnumerate + 582 
25 AppKit        0x00007fff89aafff6 -[NSView _layoutSubtreeHeedingRecursionGuard:] + 465 
26 AppKit        0x00007fff89aafd2e -[NSView layoutSubtreeIfNeeded] + 615 
27 AppKit        0x00007fff89aab4dc -[NSWindow(NSConstraintBasedLayout) layoutIfNeeded] + 201 
28 AppKit        0x00007fff899d96a8 -[NSView _layoutAtWindowLevelIfNeeded] + 99 
29 AppKit        0x00007fff899d8fe6 -[NSView _sendViewWillDrawInRect:clipRootView:] + 87 
30 AppKit        0x00007fff899a59b1 -[NSView displayIfNeeded] + 1044 
31 AppKit        0x00007fff89a62a48 -[NSWindow _reallyDoOrderWindow:relativeTo:findKey:forCounter:force:isModal:] + 1377 
32 AppKit        0x00007fff89a62068 -[NSWindow _doOrderWindow:relativeTo:findKey:forCounter:force:isModal:] + 940 
33 AppKit        0x00007fff89a61c4f -[NSWindow orderWindow:relativeTo:] + 159 
34 AppKit        0x00007fff89963266 -[NSIBObjectData nibInstantiateWithOwner:topLevelObjects:] + 1424 
35 AppKit        0x00007fff8994214d loadNib + 317 
36 AppKit        0x00007fff89941679 +[NSBundle(NSNibLoading) _loadNibFile:nameTable:withZone:ownerBundle:] + 219 
37 AppKit        0x00007fff899414ae -[NSBundle(NSNibLoading) loadNibNamed:owner:topLevelObjects:] + 200 
38 AppKit        0x00007fff8994128e +[NSBundle(NSNibLoading) loadNibNamed:owner:] + 360 
39 AppKit        0x00007fff8993da2f NSApplicationMain + 398 
40 CDTOANYDRIVE      0x0000000100000e82 main + 34 
41 libdyld.dylib      0x00007fff9385a7e1 start + 0 
42 ???         0x0000000000000003 0x0 + 3 
) 

而上述錯誤顯示兩次!

+0

此問題與iPhone,iOS主題無關。 – Tirth 2013-04-25 05:43:18

+0

@YU FENG你可以把NSlog語句調試行和[_tableCountents count]來檢查一切是否正確 – 2013-04-25 05:57:54

+0

希望你在tableContent被填充後調用reloadData, – Amitg2k12 2013-04-25 06:11:44

回答

1

我試過你的代碼在一個迷你應用程序,它工作正常。有幾件事我可能會強調:

  1. 您的異常發生在方法DetectingUSBDrives,我們沒有任何代碼。我假設你已經在awakeFromNib方法中粘貼了代碼。
  2. 您正在使用count作爲索引。這個varibale是否初始化爲零?
  3. 錯誤出現兩次的事實表明您的單元視圖持有對您的應用程序委託的引用,這意味着每次創建視圖都會調用一次awakeFromNib。這可能會產生很多問題,因爲您正在初始化_tableOfContents。您可能需要將所有代碼移至init方法。
+0

謝謝你。我發現了這個問題。你說得對,我應該把所有的東西都改爲init方法。再次感謝 !! – 2013-04-26 02:11:08