4

비교적 일반적인 작업이라고 생각되는 것을 수행하는 데 어려움을 겪고 있습니다. 나는 배열에 NSArrayController을 통해 바인딩 된 NSTableView을 가지고 있습니다. 배열 컨트롤러의 내용은 모델 클래스의 하나 이상의 NSObject 인스턴스가 포함 된 NSMutableArray으로 설정되어 있습니다. 어떻게 해야할지 모르겠지만, 바인딩이 쉬운 방식으로 모델을 NSCell 서브 클래스에 노출시켜야합니다.NSTableView의 사용자 지정 NSCell에서 바인딩을 사용하여 모델 개체 노출

설명의 목적으로 개체 모델은 이름, 성, 나이 및 성별로 구성된 사람이라고 말합니다. 따라서 모델은 다음과 같이 나타납니다.

@interface PersonModel : NSObject { 
    NSString * firstName; 
    NSString * lastName; 
    NSString * gender; 
    int * age; 
} 

분명히 적절한 설정 도구, 클래스에 대한 getter init 등입니다. 내 컨트롤러 클래스에서

내가 정의한 NSTableView, NSMutableArrayNSArrayController :

myPersonArray --> myPersonArrayController --> table column binding

이 작품 : 나는 쉽게 해당 컬럼 모델을 결합 할 수있는 인터페이스 빌더를 사용하여

@interface ControllerClass : NSObject { 
    IBOutlet NSTableView * myTableView; 
    NSMutableArray * myPersonArray; 
    IBOutlet NSArrayController * myPersonArrayController; 
} 

벌금. 그래서 여분의 열을 제거하고 NSArrayController에 바인딩 된 하나의 열을 숨기고 (이것은 각 행과 NSArrayController 사이의 연결을 생성하고 유지하므로) 내 NSTableView과 숨겨진 열의 표시 열 중 하나가 표시됩니다. 내가 NSCell 하위 클래스를 만들고 셀을 만들려면 적절한 그리기 방법을 넣어.

MyCustomCell * aCustomCell = [[[MyCustomCell alloc] init] autorelease]; 
[[myTableView tableColumnWithIdentifier:@"customCellColumn"] 
    setDataCell:aCustomCell]; 

이를 너무, 도면의 관점에서 잘 작동 : 내 awakeFromNib에서 나는 사용자 정의 NSCell 서브 클래스를 설정합니다. 내 사용자 정의 셀을 열에 표시하고 배열 컨트롤러의 모든 관리 객체에 대해 반복합니다. 배열 컨트롤러에서 객체를 추가하거나 객체를 제거하면 그에 따라 테이블이 업데이트됩니다.

그러나 ... 내 PersonModel 개체가 내 NSCell 하위 클래스에서 사용할 수 있다는 인상하에있었습니다. 그러나 나는 그것에 도착하는 방법을 모른다. setter와 getters를 사용하여 각각 NSCell을 설정하고 싶지 않습니다. 그 이유는 배열 컨트롤러에서 참조하는 대신 NSCell에 데이터를 저장하여 전체 모델 개념을 깨기 때문입니다.

예, 사용자 정의 NSCell이 있어야 여러 열을 가질 수 없습니다. 여기 어디에서 왔니?

Google 및 StackOverflow 검색 외에도 필자는 Apple의 문서를 반드시 읽으면서 답변을 찾지 못한 것 같습니다. 나는 수풀을 두들겨 다니는 많은 참고 문헌을 발견했지만 NSArrayController과 관련된 것은 발견하지 못했습니다. 컨트롤러는 모델 엔티티의 다른 요소 (예 : 마스터/세부 시나리오)에 바인딩 할 때 매우 쉽게 작업을 수행합니다. 나는 Core Data를 사용할 때 많은 답변을 찾았지만 Core Data를 사용하지는 않았다.

표준에 따라 제공 할 수있는 도움에 대해 매우 감사드립니다!

답변

3

마지막으로 알아 냈습니다. 어떤 일을 한 사람. 그래서 여기 내가해야 할 일이있다.

우선 내 모델 개체의 키 값 배열을 만들고이 키 값을 NSDictionary 모델에서 반환해야했습니다.

따라서 내 모델은 두 가지 새로운 방법을 다음과 같이있어 (내 위의 간단한 예 기준) : 일단 구현

+(NSArray *)personKeys 
{ 
    static NSArray * personKeys = nil; 
    if (personKeys == nil) 
     personKeys = [[NSArray alloc] initWithObjects:@"firstName", @"lastName", @"gender", @"age", nil]; 

    return personKeys; 
} 

-(NSDictionary *)personDictionary 
{ 
    return [self dictionaryWithValuesForKeys:[[self class] personKeys]]; 
} 

, 내 경계 내 테이블에 value

arrayController --> arrangeObjects --> personDictionary을 할당합니다.

마지막 단계는 NSCelldrawWithFrame의 객체를 참조하고 다음과 같이 필요에 따라 사용하는 것입니다

NSDictionary * thisCellObject = [self objectValue]; 

NSString * objectFirstName = [thisCellObject valueForkey:@"firstName"]; 
NSString * objectLastName = [thisCellObject valueForKey:@"lastName"]; 

을 그리고 희망으로, 모델 객체에 대한 업데이트는 사용자 정의 NSCell에 반영합니다.

+0

이것은 훌륭합니다. 나는 한동안 구현의 괴물과 싸우고 있었고,보기 흉한 프랑켄슈타인 만 보였습니다. CoreData 객체를 사용하고 있지만 이것이 훌륭한 해결책이라고 생각합니다. –

+0

@Greg - 기꺼이 서비스 할 수 있습니다! 나는 해결책을 찾기 전에 며칠 동안이 문제를 감추었습니다. – Hooligancat

0

내 프로젝트가이 문제로 인해 멈추었 고 Tim Isted의 동일한 솔루션을 보았을 때 매우 힘겨운이 게시물 인 Hooligancat에 대해 매우 고맙습니다. http://www.timisted.net/blog/archive/custom-cells-and-core-data/ 알아낼 수 없었습니다.

문제를 단순화하고 페니가 떨어 뜨린 솔루션 버전을 읽은 경우에만했습니다. 매우 감사드립니다!

+1

기꺼이 도와 드릴 수 있습니다. 나는 당신이 발견 한 그 실을 보았 으면 좋겠다 !! 아마 나에게 몇 시간을 구했을 것입니다! 내 애플 리케이션에서 핵심 데이터를 사용하지 않는 이유는 서버 측에 데이터가 저장되어 있기 때문에 핵심 데이터를 사용하는 것보다 벽에 부딪히는 경향이 있기 때문이다. 어느쪽으로 든, 우리는 둘 다 일하는 해결책이있다! Kewl ... – Hooligancat

1

사전을 필요로하지 않는 또 다른 방법이 있습니다. 그러나 데이터 클래스 내에서 - (id) copyWithZone : (NSZone *) 영역 메서드를 구현해야합니다. 예를 들어 : -> arrangedObjects

drawWithFrame 방법은 이제 objectValue에서 실제 개체를 반환합니다

- (id)copyWithZone:(NSZone *)zone { 
    Activity *copy = [[self class] allocWithZone: zone]; 
    copy.activityDate = self.activityDate; 
    copy.sport = self.sport; 
    copy.sportIcon = self.sportIcon; 
    copy.laps = self.laps; 
    return copy; } 

지금 IB, 당신은 어레이 컨트롤러의 테이블 열 값을 가리 킵니다.

Activity *rowActivity = [self objectValue]; 

클래스를 변경하려면 copyWithZone 메서드를 업데이트 한 다음 drawWithFrame 메서드에서 직접 데이터에 액세스해야합니다.