3

アイテムを展開すると、不正なアクセス エラーが発生しますNSOutlineViewNSStringsで配置した場合、アウトライン展開時にエラーが発生するstringWithFormat:EXC_BAD_ACCESS@"string" の形式で文字列に置き換えた場合、エラーは発生しません。

ARC で何かがリリースされていると思いますが、それが起こらないようにする方法がわかりません。ここにないものは何ですか?

-(NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item {

    if(!item)
        return [_characterList count];
    else if( [item isKindOfClass:[Character class]] )
        return 3;

    return 0;

}

-(BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item {

    if( [item isKindOfClass:[Character class]] )
        return YES;

    return NO;

}

-(id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item {

    if (!item)
        return (Character*)[_characterList objectAtIndex:index];
    else {

        NSLog(@"%@", item);

        Character *characterItem = (Character*)item;

        switch (index) {
            case 0:
                return [NSString stringWithFormat:@"Api key: %@", [characterItem apiKey]];
                break;
            case 1:
                return [NSString stringWithFormat:@"Access Mask: %@", [characterItem mask]];
                break;
            case 2:
                return @"Last Updated: today";
                break;
            default:
                break;
        }

    }

    return nil;

}

-(id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item {

    if([item isKindOfClass:[Character class]])
        return [(Character*)item name];
    else
        return item;

    return nil;

}
4

1 に答える 1

3

私が思いついた解決策(しかし、特に好きではありません)。OutlineView:objectValueForTableColumn:byItem: を次のコードに置き換えます。

-(NSView*)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item {

NSTableCellView *cell = [outlineView makeViewWithIdentifier:@"characterColumn" owner:self];

    if([item isKindOfClass:[Character class]]) {
        [cell.textField setStringValue:[item name]];
    } else if([item isKindOfClass:[NSString class]]) {
        [cell.textField setStringValue:item];
    }

    return cell;

}

基本的に、これが行うことは、セル コードが行うことを期待することとまったく同じですが、物事を適切に保持しているように見えます。大衆からの洞察はありますか?

編集:これが取引です。NSOutlineView の dataSource デリゲート メソッドは、所有権に関してもう少し具体的です。アイテムには複数のレベルがないため、通常の NSTableView で対処する必要はありません。基本的に、他の場所で表示するすべてのオブジェクトを作成し、それらが他の場所のメモリで管理されていることを確認する必要があります。

于 2013-06-19T13:40:51.403 に答える