2011-02-01 2 views
1

4 개의 열이있는 NSTableView가있는이 프로그램은 두 개가 확인란을 만드는 프로그램입니다. 나는 지금 당장 일하는 사람을 얻으려고 노력 중이며 나는 붙어있다. 당신이 볼 수 있듯이상태를 NSTableColumn에 반영하기위한 확인란 얻기

- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView { 

    NSString *filePathThree = [[NSBundle mainBundle] pathForResource:@"mydictionary" ofType:@"plist"]; 
    NSData *myDataThree = [[NSData alloc]initWithContentsOfFile:filePathThree]; 
    self.flozzCodeAndName = (NSMutableDictionary *)[NSPropertyListSerialization 
                propertyListFromData:myDataThree 
                mutabilityOption:NSPropertyListMutableContainersAndLeaves 
                format:NULL 
                errorDescription:NULL]; 

    return [[flozzCodeAndName objectForKey:@"name"] count]; 
} 

- (void)tableView:(NSTableView *)tableView 
    setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)rowIndex 
{ 

    NSButtonCell *cell; 
    cell = [[NSButtonCell alloc] init]; 
    [cell setButtonType:NSSwitchButton]; 
    [cell setTitle:@""]; 
    [cell setTag:rowIndex]; 
    NSLog(@"%d", [cell tag]); 
    [cell setCellAttribute:NSCellEditable to:3]; 
    [cell setImagePosition:NSImageOnly]; 
    [cell setState:NSOnState]; 

    NSLog(@"%d", [cell state]); 
    [havzColumn setDataCell:cell]; 
    [myTableVeew reloadData]; 
    [cell release]; 

} 




- (id)tableView:(NSTableView *)aTableView 
objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex { 

    NSString *filePathThree = [[NSBundle mainBundle] pathForResource:@"mydictionary" ofType:@"plist"]; 
    NSData *myDataThree = [[NSData alloc]initWithContentsOfFile:filePathThree]; 
    self.flozzCodeAndName = (NSMutableDictionary *)[NSPropertyListSerialization 
                propertyListFromData:myDataThree 
                mutabilityOption:NSPropertyListMutableContainersAndLeaves 
                format:NULL 
                errorDescription:NULL]; 

    NSArray *myArray = [flozzCodeAndName objectForKey:[aTableColumn identifier]]; 

    NSString *myStringValue = [myArray objectAtIndex:rowIndex]; 

    return myStringValue; 
} 

것은, 내가이 테이블보다는 바인딩에 대한 데이터 소스 방법을 사용하고 있습니다 :
첫째, 여기 내 관련 코드입니다. 코코아에 대해 읽은 책은 태그가있는 체크 박스를 만들었지 만 태그가 배열에 있다고 생각합니다. 그렇게하는 것이 가장 좋은 방법은 아닙니다.

어쨌든 이것을 실행하면 디버거가 버튼의 상태 (NSOnState 때문에 모두 1)와 함께 태그 (행과 동일)를 표시합니다. 내 문제는 내가 상자를 그들의 상태에 따라 확인하고 선택을 취소 할 수 없다는 것입니다. 나는이 질문을 읽었다 : Checkbox on table column won't register click

그리고 나서 NSTableView 데이터 소스 참조. Nozzi 씨에 따르면 연결된 질문에 따르면 상자의 상태를 포함하는 배열이 필요하므로 NSMutableArray에 들어가기 위해 [cell state]을 NSNumber로 설정해 보았습니다. 나는 그것을 배웠고 그것이 옳다고 생각하지 않는다. 이 테이블에는 454 개의 행이 있습니다 (태그는 0부터 시작하는 배열로 인해 453으로 이동 함).

또한 tableview : setObjectValue :에있는 셀 정의 내용을 'awakeFromNib'에 넣어야하는지 궁금합니다. IB에 체크 박스 버튼 셀을 넣었지만 이전에 문제가 있었기 때문에 프로그래밍 방식으로도 결정했습니다. 이 모든 과정에서 나는 setObjectValue 메소드에 [myTableVeew reloadData]을 가지고 있었고 아직 가지고 있습니다.

다른 정보가 필요하면 지원해 주시면 감사하겠습니다.

답변

4

당신은 두 가지 문제가 있습니다 귀하의 데이터 소스가 날아지고 계속하고 제대로 ... objectValue이 ... 방법을 사용하지 않는 것입니다.

데이터 소스 : 방법과 그것을 테이블이 새로 고침을 할 필요 때마다 교체 : 당신은 당신의 -numberOfRowsInTableView에서 데이터 소스를 멀리 불고 있습니다. 필요한 경우 (예 : 응용 프로그램 시작시)에만 테이블 데이터 소스 메소드에서 참조 할 때만 사전의 캐시 가능 (변경 가능한 사본)을 원할 것입니다. 인스턴스 변수로 옮겨서 적절한 접근자를 사용해야합니다.

또한 데이터 소스 메소드가 매우 자주 호출되므로이 메소드는 빠르다는 점을 언급하므로 퍼포먼스 관점에서만 볼 때 이것은 좋은 생각이 아닙니다. 대용량 데이터 세트를 사용하여 테이블을 응답하도록 유지하기 위해 위임 메서드가 제기하는 질문에 대답하는 데 필요한 작업 만 수행하면됩니다.

개체 값 :. 당신은 단지 일반적으로이 방법 (이 확인란을 전환하기위한 것입니다 상태를 포함하는의 NSNumber 객체

에서 개체의 값을 반환해야 당신은 당신의 테이블 컬럼의 -dataCell를 설정해야합니다보기 더 쉽게 : Interface Builder의 테이블 열에 체크 박스 셀을 드래그하여 코드없이 데이터 셀로 설정하십시오.

추가 관측 : 당신이이 쓸 수있는 응용 프로그램 번들에 의존해서는 안 과 하나 당신 '과 같은 리소스 파일을 덮어 쓰기를 시도해서는 안됩니다 있습니다, 어떤 방법으로이 정보에 대한 변경 사항을 유지하려는 경우 번들에서 다시로드하십시오. 번들 사본을 템플릿 복사본으로 사용하여 다른 곳에 정보를 저장해야합니다. .