2012-01-06 1 views
5

새 프로그램의 소스 목록을 만들려고하고 있는데 뷰 기반 NSOutlineView를 사용하여 약간의 문제가 있습니다. 내 코드는 셀 기반 NSOutlineView를 사용하여 잘 작동하므로 어떤 일이 일어나고 있는지 혼란 스럽다. 내가 디버거를 통해이 프로그램을 실행할 때이 outlineView:objectValueForTableColumn:byItem:이 실행되지 않는 것을 볼 수outlineView : objectValueForTableColumn : byItem : not called

#pragma mark - 
#pragma mark NSOutlineView Delegate 

- (BOOL)outlineView:(NSOutlineView *)outlineView isGroupItem:(id)item { 
    return (item == nil) ? YES : [(SourceListNode *)item groupItem]; 
} 

- (id)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item { 
    if ([(SourceListNode *)item groupItem]) { 
     return [outlineView makeViewWithIdentifier:@"HeaderCell" owner:self]; 
    } 
    else { 
     return [outlineView makeViewWithIdentifier:@"DataCell" owner:self]; 
    } 
} 

#pragma mark - 
#pragma mark NSOutlineView Data Source 

- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item { 
    return (item == nil) ? [sourceListNodes count] : [(SourceListNode *)item numberOfChildren]; 
} 

- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item { 
    return (item == nil) ? YES : ([(SourceListNode *)item numberOfChildren] > 0); 
} 

- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item { 
    return (item == nil) ? [sourceListNodes objectAtIndex:index] : [(SourceListNode *)item childAtIndex:index]; 
} 

- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item { 
    return [(SourceListNode *)item name]; 
} 

:

여기 대리인 및 데이터 소스에 대한 내 코드입니다. 결과는 텍스트가없는 개요보기입니다. 정확한 세포가 만들어졌고 그들을 선택하고 확장 할 수 있습니다. 내가 뭘 놓치고 있니?

업데이트 : IB에서 내 소스 목록을 삭제하고 새 목록을 추가 한 다음 컨트롤러 개체에 연결했습니다. 결과는 좋았지 만 머리글 셀의 텍스트는 "HEADER CELL"이고 자식 셀의 텍스트는 "Table View Cell"이었습니다.

디버거를 통해 프로그램을 다시 실행했으며 이번에는 outlineView:objectValueForTableColumn:byItem:이 실행되었습니다. 그것은 세포의 텍스트를 채우지 않았다. 다음과 같이

그때 outlineView:viewForTableColumn:item: 업데이트 : 예상대로

- (id)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item { 
    NSTableCellView *result; 
    if ([(SourceListNode *)item groupItem]) { 
     result = [outlineView makeViewWithIdentifier:@"HeaderCell" owner:self]; 
    } 
    else { 
     result = [outlineView makeViewWithIdentifier:@"DataCell" owner:self]; 
    } 

    [[result textField] setStringValue:[(SourceListNode *)item name]]; 

    return result; 
} 

이제 모든 것이 작동합니다.

간단히 말해서, 나는 나의 문제를 해결했다. 그러나 나는 이제 또 다른 질문을 가지고있다. 보기 기반 개요보기에 outlineView:objectValueForTableColumn:byItem:의 목적은 무엇입니까? 실행되지만 아무 것도 보이지 않습니다.

+0

안녕하세요 John, 왜 objectValueForTableColumn이 뷰 기반 개요보기에 필요한지 알아 냈습니까? 나도 똑같은 것을 궁금해. – Indoor

답변

4

뷰 기반은 셀 기반이 아닌 다른 태도입니다.

"id"반환 값을 "NSView"로 바꾸면됩니다.

변경이 : 여기에

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

: 이것은 가정이 주어집니다

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

는 10.7을 실행하고 당신은 NSView의를 반환가는 실제로 있습니다.

+0

'id'를 NSView *로 변경했습니다. 내 업데이트 결과를 원래 게시물로 변경하지 않았습니다. –

+0

나는 이것을 붙잡아 주어서 고맙다. –

+0

NSTableCellView를 반환하지 마십시오. NSView를 반환합니다. 반환하는 NSView에는 초기화 된 프레임이있을 필요가 없습니다. NSControl이이를 제어합니다. 새로운 NSView를 채우고 요소를 추가 한 다음 반환하십시오. – evdude100

관련 문제