0

だから私はココアでアプリを構築していて、少し問題があります。配列コントローラーを使用して、さまざまなフォルダー内のテキスト ファイル名をテーブルビューにフィードしたいのですが、範囲外のエラーが発生し続けます。Heres は、私に問題を引き起こしているコードの一部です。

[self clear:nil]; // method that clears the NSTableView

NSString *chooserSelection = chooserItems.titleOfSelectedItem; // gets the selected folder from an NSPopUpButton

if (chooserSelection == @"All") {
    path = @"/Library/Application Support/File Folder/Files/";
    NSArray *folders = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:nil];
    NSLog(@"\nfolders = %@", folders);

    for (int i = 0; i < [folders count]; i++) {

            path = @"/Library/Application Support/File Folder/Files/";
            NSMutableString *folderNames = [[NSMutableString stringWithString:path] init];
            [folderNames insertString:folders[i] atIndex:folderNames.length];
            [folderNames insertString:@"/" atIndex:folderNames.length];

            NSArray *text = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:folderNames error:nil];


        [myArrayController addObject: [NSMutableDictionary dictionaryWithObjectsAndKeys:text[i], @"File Name", nil]]; 
        //This line gives the error

    }
}

[folders count] を 1 に変更すると、NSTableView に表示されます。ただし、それを超えると(forループを通過する追加のパス)、範囲外のエラーが発生します。

2013-02-26 13:17:49.679 AppName[3489:403] *** -[__NSArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]
2013-02-26 13:17:49.683 AppName[3489:403] (
    0   CoreFoundation                      0x00007fff829b5f56 __exceptionPreprocess + 198
    1   libobjc.A.dylib                     0x00007fff84fe6d5e objc_exception_throw + 43
    2   CoreFoundation                      0x00007fff8295f370 -[__NSArrayI objectAtIndex:] + 208
    3   AppName                             0x000000010000159a -[AppDelegate tableView:objectValueForTableColumn:row:] + 106
    4   AppKit                              0x00007fff840a16e7 -[NSTableView _dataSourceValueForColumn:row:] + 73
    5   AppKit                              0x00007fff840a1167 -[NSTableView preparedCellAtColumn:row:] + 437
    6   AppKit                              0x00007fff840b2171 -[NSTableView _drawContentsAtRow:column:withCellFrame:] + 42
    7   AppKit                              0x00007fff840b05d8 -[NSTableView drawRow:clipRect:] + 1647
    8   AppKit                              0x00007fff840afdb5 -[NSTableView drawRowIndexes:clipRect:] + 565
    9   AppKit                              0x00007fff840aded7 -[NSTableView drawRect:] + 1390
    10  AppKit                              0x00007fff84197382 -[NSView(NSInternal) _recursive:displayRectIgnoringOpacity:inContext:topView:] + 1435
    11  AppKit                              0x00007fff841b564f __-[NSView(NSLayerKitGlue) drawLayer:inContext:]_block_invoke_1 + 94
    12  AppKit                              0x00007fff841b52fb -[NSView(NSLayerKitGlue) _drawViewBackingLayer:inContext:drawingHandler:] + 2001
    13  QuartzCore                          0x00007fff82c4a0dc -[CALayer drawInContext:] + 145
    14  QuartzCore                          0x00007fff82c49225 CABackingStoreUpdate_ + 3221
    15  QuartzCore                          0x00007fff82c4813a _ZN2CA5Layer8display_Ev + 1086
    16  AppKit                              0x00007fff841504e6 -[NSView(NSInternal) _recursiveDisplayViewsIntoLayersIfNeeded] + 163
    17  AppKit                              0x00007fff841505fc -[NSView(NSInternal) _recursiveDisplayViewsIntoLayersIfNeeded] + 441
    18  AppKit                              0x00007fff841505fc -[NSView(NSInternal) _recursiveDisplayViewsIntoLayersIfNeeded] + 441
    19  AppKit                              0x00007fff841505fc -[NSView(NSInternal) _recursiveDisplayViewsIntoLayersIfNeeded] + 441
    20  AppKit                              0x00007fff84150168 -[NSView(NSLayerKitGlue) _drawRectAsLayerTree:] + 128
    21  AppKit                              0x00007fff8401653e -[NSView _drawRect:clip:] + 4382
    22  AppKit                              0x00007fff8401406d -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] + 3020
    23  AppKit                              0x00007fff84014b5e -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] + 5821
    24  AppKit                              0x00007fff84012da3 -[NSThemeFrame _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] + 270
    25  AppKit                              0x00007fff8400e1bb -[NSView _displayRectIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:] + 4755
    26  AppKit                              0x00007fff84006c35 -[NSView displayIfNeeded] + 1676
    27  AppKit                              0x00007fff84006375 _handleWindowNeedsDisplayOrLayoutOrUpdateConstraints + 648
    28  CoreFoundation                      0x00007fff829758e7 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
    29  CoreFoundation                      0x00007fff82975846 __CFRunLoopDoObservers + 374
    30  CoreFoundation                      0x00007fff8294aaf9 __CFRunLoopRun + 825
    31  CoreFoundation                      0x00007fff8294a486 CFRunLoopRunSpecific + 230
    32  AppKit                              0x00007fff84459b08 -[NSMenu _internalPerformActionForItemAtIndex:] + 38
    33  AppKit                              0x00007fff842e86f9 -[NSCarbonMenuImpl _carbonCommandProcessEvent:handlerCallRef:] + 138
    34  AppKit                              0x00007fff841349bb NSSLMMenuEventHandler + 339
    35  HIToolbox                           0x00007fff89d08234 _ZL23DispatchEventToHandlersP14EventTargetRecP14OpaqueEventRefP14HandlerCallRec + 1263
    36  HIToolbox                           0x00007fff89d07840 _ZL30SendEventToEventTargetInternalP14OpaqueEventRefP20OpaqueEventTargetRefP14HandlerCallRec + 446
    37  HIToolbox                           0x00007fff89d1e6db SendEventToEventTarget + 76
    38  HIToolbox                           0x00007fff89d647b5 _ZL18SendHICommandEventjPK9HICommandjjhPKvP20OpaqueEventTargetRefS5_PP14OpaqueEventRef + 398
    39  HIToolbox                           0x00007fff89e4be2d SendMenuCommandWithContextAndModifiers + 56
    40  HIToolbox                           0x00007fff89e935b5 SendMenuItemSelectedEvent + 253
    41  HIToolbox                           0x00007fff89d5d883 _ZL19FinishMenuSelectionP13SelectionDataP10MenuResultS2_ + 101
    42  HIToolbox                           0x00007fff89e8bfed _ZL19PopUpMenuSelectCoreP8MenuData5PointdS1_tjPK4RecttjS4_S4_PK10__CFStringPP13OpaqueMenuRefPt + 1660
    43  HIToolbox                           0x00007fff89e8c2ac _HandlePopUpMenuSelection7 + 621
    44  AppKit                              0x00007fff842eb3c5 _NSSLMPopUpCarbonMenu3 + 3860
    45  AppKit                              0x00007fff846990fa _NSPopUpCarbonMenu3 + 39
    46  AppKit                              0x00007fff842e952a -[NSCarbonMenuImpl popUpMenu:atLocation:width:forView:withSelectedItem:withFont:withFlags:withOptions:] + 322
    47  AppKit                              0x00007fff844ca1f1 -[NSPopUpButtonCell trackMouse:inRect:ofView:untilMouseUp:] + 564
    48  AppKit                              0x00007fff840cb7f6 -[NSControl mouseDown:] + 786
    49  AppKit                              0x00007fff84096c98 -[NSWindow sendEvent:] + 6306
    50  AppKit                              0x00007fff840303a5 -[NSApplication sendEvent:] + 5593
    51  AppKit                              0x00007fff83fc6a0e -[NSApplication run] + 555
    52  AppKit                              0x00007fff84242eac NSApplicationMain + 867
    53  AppName                             0x0000000100001152 main + 34
    54  AppName                             0x0000000100001124 start + 52
)

また、最後のファイルのファイル名を表示する for ループの下の行に addObject 行を追加することもできます。しかし、境界外エラーがどこから来ているのかわかりません。

4

1 に答える 1

0

最初にパス内のフォルダーの数にインデックス i を使用し、次にそのそれぞれのフォルダー内のファイルの数に使用しています。したがって、フォルダーNに少なくとも N の数と同じ数のファイルがあることに依存してます。

たとえば、3 つのフォルダがある場合

フォルダ0 フォルダ1 フォルダ2

次に、folder2(i = 2)を反復処理する場合、アイテム3(text [2])にアクセスしているため、フォルダーには少なくとも3つのアイテムが必要です。アイテムが少ない場合、範囲外エラーが発生します。

あなたはおそらく次のようなことをするつもりです:

        NSMutableDictionary* dict = 
     [NSMutableDictionary dictionaryWithObjectsAndKeys:text, folders[i], nil];

これにより、辞書の配列が取得されます。各辞書には、1 つのキー (フォルダーの名前) と 1 つの値 (ファイル名の配列) があります。

これを(配列内ではなく)単一の辞書にフラット化することで、データ構造をさらに簡素化できます。各キーはフォルダ名で、各値はファイル名の配列です。

于 2013-02-26T20:17:12.313 に答える