2011-08-19 4 views
1

NSOutlineView로 자르기 이상한 문제가 있습니다. 이보기는 본질적으로 관련 파일이 하위 항목 인 앱 목록입니다. 나는 그것의 데이터 소스와 그 모든 작품에 잘 손으로보기를 채 웁니다. 지금 내가하고 싶은 것은 항목을 제거하는 버튼이 있습니다. 그것을 위해 나는과 같이, 방법, removeAppOrFile을 구현 :NSOutlineView에서 셀 내용 검색

- (IBAction)removeAppOrFile:(id)sender 
{ 
    NSInteger selectedRow = [myView selectedRow]; 
    if (selectedRow == -1) //ie. nothing's selected 
    { 
     return; 
    } 
    NSTableColumn *col = [myView tableColumnWithIdentifier:@"Column 1"]; 
    NSCell *cell = [col dataCellForRow:selectedRow]; 
    NSString *item = [cell stringValue]; 
    NSLog(@"The row is: %ld\nThe column is: %@\nThe cell is: %@\nThe selected item is: %@",selectedRow, col, cell, item); // For testing purposes 
} 

MYVIEW 내 NSOutlineView에 연결 함께 IBOutlet입니다. 다른 행을 선택하고 버튼을 클릭하면 selectedRow의 값이 올바르게 변경되지만 NSCell 객체는 변경되지 않으며 값 (NSString 항목)은 항상 마지막으로 표시되는 항목의 값을 표시합니다 (예 : if NSString 항목은 펼쳐지지 않은 경우에는 부모가되고 확장 된 경우에는 마지막 자식이됩니다).

이상한 일은 기본적으로 NSOutlineView에서 doubleAction에 대해 다른 코드와 동일한 코드를 사용한다는 것이고 완벽하게 작동합니다. 이 경우 코드는 다음과 같습니다.

- (void)editedAppOrFile:(id)sender 
{ 
    NSInteger rowNumber = [sender clickedRow]; 
    NSTableColumn *col = [sender tableColumnWithIdentifier:@"Column 1"]; 
    NSCell *cell = [col dataCellForRow:rowNumber]; 
    NSString *item = [cell stringValue]; 
    NSLog(@"The row is: %ld\nThe column is: %@\nThe cell is: %@\nThe selected item is: %@",selectedRow, col, cell, item); // For testing purposes 
} 

이 경우 발신자는 outlineView입니다. 항목 & rowNumber가 변경된 셀 변경.

첫 번째 예에서 작동하지 않는 이유는 무엇입니까?

답변

3

접근 방법에는 몇 가지 문제가 있습니다.

  1. 데이터 셀은 -preparedCellAtColumn:row:이 아니므로 내부 개체 값에 대한 보장이 없습니다.
  2. -itemAtRow:에 대한 개요보기를 직접 요청할 수 있습니다.
  3. 첫 번째 경우를 삭제하거나 두 번째 경우를 편집하려는 경우 데이터 원본을 수정 한 다음 변경된 행 수 (첫 번째 경우) 또는 행의 데이터 다시로드 (예 : 두 번째 경우).
+0

개요보기를 쿼리하면 직접 문제가 해결되었습니다. 감사! – VsSoft

+0

다른 주석에 관해서는 : 여기에 데이터 소스를 수정하는 방법은 다음과 같습니다. 배열에 값이 들어있는 사전에 데이터가 저장되어 있습니다 (예 : KEY : 앱 이름 VALUES : File1, File2, File3). 나는 부모로서 키로, FileX로 자식으로 뷰를 채우고있다. 단추를 눌러 항목을 삭제할 때 어떤 항목이 선택되어 있는지를 알아야하므로 위와 같이했습니다. 그런 다음 선택한 파일 또는 응용 프로그램에 따라 삭제를 처리합니다. 나는 아마 뭔가를 잃어 버렸지 만 항목을 가져 오지 않고 데이터를 수정할 수있는 방법을 모르겠습니다. – VsSoft

+1

요점은 데이터 소스 (컨트롤러)가 뷰에 모델 객체를 제공 한 다음 (복잡한 기계를 통해) 모델 객체의 속성을 손으로 돌려 주도록 요청하는 것입니다. 이것은 MVC 디자인 패턴의 결정에 반하는 결정입니다. -itemAtRow : 또는 NSTableView의 선택된 행 인덱스를 통해 선택 사항에 대한 개요보기를 (컨트롤러로) 요청하고 모델 객체로 직접 작업하는 것은 절대적으로 이동하는 방법입니다. –

관련 문제