2009-08-24 5 views
4

NSOutlineView의 편집 가능한 셀을 만드는 방법을 알고있는 사람이 있습니까? 나는 사과에서 sampe 코드를 사용하여 나는 그것을 전혀 작동하지 않는 것.NSOutlineView 행을 편집 가능하게하기

NSOutlineView의 셀에서 빠르게 연속해서 두 번 클릭하면 셀이 편집 가능 해져 사용자가 셀 안의 텍스트를 업데이트 할 수 있도록 설정하려고합니다. (xcode에서 작동하는 것과 같은 방식으로, 그리고 메일 등).

나는이 컨트롤러의 나머지 코드 대부분을 내가 뭘 잘못하고 있는지를 알 수있는 헛된 희망으로 포함시키고있다. 매우 실망 스럽다. 두 번 클릭하면 NSLog 메시지를 반환하므로 shouldEditTableColumn이 호출되고 있음을 알고 있습니다.

@implementation DisplayHierarchyController 
- (void)awakeFromNib { 
    // cache the reused icon images 
    folderImage = [[[NSWorkspace sharedWorkspace] iconForFileType:NSFileTypeForHFSTypeCode(kGenericFolderIcon)] retain]; 
    [folderImage setSize:NSMakeSize(16,16)]; 
    objectImage = [[[NSWorkspace sharedWorkspace] iconForFileType:NSFileTypeForHFSTypeCode(kGenericPreferencesIcon)] retain]; 
    [objectImage setSize:NSMakeSize(16,16)]; 
    diagramImage = [[[NSWorkspace sharedWorkspace] iconForFileType:NSFileTypeForHFSTypeCode(kGenericEditionFileIcon)] retain]; 
    [diagramImage setSize:NSMakeSize(16,16)]; 
    // 
    // Tell the outline view to use a special type of cell 
    //NSTableColumn *tableColumn = [[outline tableColumns] objectAtIndex: 0]; 
    //ImageTextCell *imageTextCell = [[[ImageTextCell alloc] init] autorelease]; 
    //[imageTextCell setEditable:YES]; 
    //[tableColumn setDataCell:imageTextCell]; 
    // 
    [[[outline tableColumns] objectAtIndex: 0] setEditable: YES]; 
} 
- (BOOL)outlineView:(NSOutlineView *)outlineView shouldEditTableColumn:(NSTableColumn *)tableColumn item:(id)item { 
    NSLog(@"edit %@", tableColumn); 
    return YES; 
} 
- (NSCell *)outlineView:(NSOutlineView *)outlineView dataCellForTableColumn:(NSTableColumn *)tableColumn item:(id)item { 
    ImageTextCell *imageTextCell = [[[ImageTextCell alloc] init] autorelease]; 
    [imageTextCell setEditable:YES]; 
    return imageTextCell; 
} 
// Returns the object that will be displayed in the tree 
- (id)outlineView: (NSOutlineView *)outlineView child: (int)index ofItem: (id)item { 
    if(item == nil) 
     return [[document children] objectAtIndex: index]; 
    if([item isKindOfClass: [Item class]]) 
     return [[item children] objectAtIndex: index]; 
    return document; 
} 
- (BOOL)outlineView: (NSOutlineView *)outlineView isItemExpandable: (id)item { 
if([item isKindOfClass: [Item class]]) 
    return [[item children] count]>0; 
return NO; 
} 
- (int)outlineView: (NSOutlineView *)outlineView numberOfChildrenOfItem: (id)item { 
    if(item == nil) 
     return document.children.count; 
    if([item isKindOfClass: [Item class]]) 
     return [[item children] count]; 
    return 0; 
} 
- (id)outlineView: (NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item { 
    if([item isKindOfClass: [Item class]]) 
     return [item name]; 
    return @"n/a"; 
} 
- (void)outlineView:(NSOutlineView *)outlineView setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn byItem:(id)item { 
    NSLog(@"setObjectValue called"); 
} 
- (void)outlineView:(NSOutlineView *)olv willDisplayCell:(NSCell*)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item { 
    [cell setEditable: YES]; 
    [cell setAllowsEditingTextAttributes: YES]; 
    [(ImageTextCell*)cell setImage: objectImage]; 
} 
- (BOOL)control:(NSControl *)control textShouldBeginEditing:(NSText *)fieldEditor { 
    return YES; 
} 
- (BOOL)control:(NSControl *)control textShouldEndEditing:(NSText *)fieldEditor { 
    if ([[fieldEditor string] length] == 0) { 
     // don't allow empty node names 
     return NO; 
    } else { 
     return YES; 
    } 
} 
@end 
+1

"전혀 작동하지 않는 것 같습니다."이 뜻은 무엇입니까? 보다 구체적으로 질문을 수정하십시오. –

+0

잘하면 그게 명확하게. 행을 두 번 클릭하면 그 행을 편집 할 수 있습니다. – Jacob

+2

이 작업을 수행하는 방법에 대한 더 많은 연구를하고 있습니다. Apple 설명서에서 "개요보기는 상위 클래스 인 NSTableView에서 그 동작을 대부분 상속받습니다. 자세한 내용은 Table View 프로그래밍 가이드를 참조하십시오. " NSTableView는이 메소드를 가지고 있습니다. "(BOOL) tableView : (NSTableView *) aTableView shouldEditTableColumn : (NSTableColumn *) aTableColumn row : (NSInteger) rowIndex"그러나 나는 그것을 얻는 방법으로 컨트롤러에 추가 할 수없는 것 같습니다 라는. – Jacob

답변

3

필자는 shouldEditTableColumn을 변경하여 "가짜"라고 할 수 있음을 발견했습니다. 그게 이상적이지는 않지만 작동합니다. 너무 많은 시간 동안 작동 시키려고하면 적어도 다음과 같은 결과가 나옵니다.

- (BOOL)outlineView:(NSOutlineView *)outlineView shouldEditTableColumn:(NSTableColumn *)tableColumn item:(id)item { 
    NSLog(@"edit %@", tableColumn); 
    [outline editColumn:0 row:[outline selectedRow] withEvent:[NSApp currentEvent] select:YES]; 
    return YES; 
} 
+0

이것은 기술적으로 올바른 대답이 아니지만 작동하기 위해 찾을 수있는 가장 가까운 것입니다. 그것은 옳은 것은 아니지만 그게 아무것도 아닌 것보다 낫다. – Jacob

6

열 자체는 편집 가능으로 설정되어 있습니까? 일반적으로 IB에서이 작업을 수행합니다.

또한 데이터 소스에 the outlineView:setObjectValue: method을 구현 했습니까?

+1

내가 인터페이스 작성기의 셀을 클릭하면 편집 가능으로 설정됩니다. 해당 셀이 이미지가있는 셀을 재정의하지만 관련성이 있는지 확실하지 않습니다. 무엇이 있어야하는지 잘 모르겠습니다. setObjectValue (문서에서 명확하지 않음) :( – Jacob

+3

셀을 말하지 않았지만 열을 말했습니다. 편집 가능한 자체 체크 박스가 있습니다.'setObjectValue :'에 관해서는 사용자가 변경 한 내용을 모델에 적용하는 곳입니다. 그것은'objectValue :'의 반대 방향으로 모델을 검사하고 그 정보를 아웃 라인보기에 제공하여 사용자에게 보여줍니다. –

+1

Doh, 미안, 내가 쓴 것을 잘못 읽었습니다. NSTableColumn은 편집 가능으로 표시되어 있습니다. (기본값이 될 것 같습니다.) – Jacob

1

이 방법을 발견했습니다. IB의 열에 대한 데이터 셀을 설정합니다 (프로그래밍 방식으로 awakeFromNib에서도 작동 함). 실제로 두 개의 다른 사용자 정의 셀 클래스를 사용합니다. 내 솔루션 :

NSCell *cell = [tableColumn dataCellForRow: [outlineView rowForItem: item]]; 

if ([item isKindOfClass: [NSString class]]) 
    return [[[ShadowTextCell alloc] initTextCell: [cell stringValue]] autorelease]; 
return cell; 
8

나는 이것이 아주 오래된 게시물입니다 알지만, 하나는 동일한 문제가 발생하는 경우,이 코드와 관련된 문제가되지 않을 수 있습니다. 제 경우에는 XIB 자체에 설정된 값과 관련된 문제였습니다.

그럼 모든 Apple 코드를 복사했는데 NSOutlineView가 실행 중이고 어떻게 편집 할 수 없는지, XIB로 이동하여 셀의 NSTextField 설정을 다음과 같이 설정한다고 가정 해 보겠습니다. 당신은 편집 가능하고 싶다. 제 경우에는 동작 설정이 기본값으로 이 아닌으로 설정되었습니다. 어쩌면 그 같은 문제가 당신

enter image description here

건배.

+0

감사! 이것은 내가 가지고있는 문제였다. IB에 체크하지 않을 것 같은 '버그'를 수정하는 데 중점을 두었습니다. – sapi

+0

Xcode8 및 Swift 3에서 shouldEditTableColumn이 호출되지 않는 뷰 기반 outlineViews의 경우에도 마찬가지입니다. 좋은 캐치. –

관련 문제