0

"콘텐트"라는 배열에 연결된 트리 컨트롤러가 있습니다. "content"는 "Car"라는 모델 객체의 배열입니다. 각 "Car"에는 "carName"이라는 NSString과 "mostPopularColors"라는 NSMutableArray가 있습니다. "mostPopularColors"에는 "가장 많이 사용되는", "두 번째로 많이 사용되는", "세 번째로 많이 사용되는"등의 값과 "빨강", "초록", "파랑"등의 값을 갖는 NSMutableDictionary 객체가 포함됩니다.코코아 - 테이블보기에 중첩 배열 표시

개요 보기는 트리 컨트롤러 배열 객체에 바인딩되고 "content"에있는 모든 "Car"의 "carName"을 표시합니다. 별도의 테이블 뷰는 모든 "carName"을 한 열에 나열합니다. 이는 트리 컨트롤러 (컨트롤러 키 : 선택, 모델 키 경로 : allChildLeafs)에 바인드 된 어레이 컨트롤러를 가짐으로써 수행됩니다. 그러면 테이블 열 값이 어레이 컨트롤러의 배열 된 개체 모델 키 경로 : carName에 바인딩됩니다.

테이블보기에서 가장 인기있는 색상과 두 번째로 가장 인기있는 색상을 각각 나열하는 두 개의 다른 열이 필요합니다. 따라서 최종 테이블에는 각 자동차의 두 가지 가장 인기있는 색상과 함께 모든 자동차 이름을 나열하는 세 개의 열이 있어야합니다.

자동차 이름은 설명 된대로 액세스 할 수 있지만 색상 자체는 배열에 있기 때문에 액세스 할 수 없습니다.

두 번째 배열 컨트롤러를 만들어 첫 번째 컨트롤러에 연결하려고했지만 작동하지 못했습니다.

결국 결국 아웃 라인보기에서 차 또는 자동차를 선택하고 테이블보기에서 각각의 이름과 각 두 가지 색상을 볼 수 있기를 바랍니다.

답변

0

2 개의 어레이 컨트롤러를 하나의 테이블보기에 연결할 수 없기 때문에 두 번째 어레이 컨트롤러가 작동하지 않는 것으로 보입니다.

트리 컨트롤러 (컨트롤러 키 : 선택, 모델 키 경로 : allChildLeafs)에 바인딩 된 배열 컨트롤러는 제자리에 남아 있었지만 뷰에 바인딩되지 않았습니다.

Xcode에서 IBOutlet NSArrayController가 생성 된 후 Interface Builder (IB)에서 새로 생성 된 어레이 컨트롤러에 연결되었습니다. 또한 setter 및 getter 메서드를 사용하여 새 NSMutableArray가 선언되었습니다. 그런 다음, 다음 코드는 새로운있는 NSMutableArray에 어레이 컨트롤러를 결합하는 데 사용되었다 :

[newArrayController bind:NSContentArrayBinding toObject:self withKeyPath:@"mutableArray" options:nil]; 

는 이제 배열 컨트롤러가 새로운 변경 가능한 배열에 있던 어떤 "보류"것입니다. 새 어레이 제어기를 테이블보기에 연결하여 어레이 내용을 표보기로 표시 할 수 있습니다.

이 변경 가능한 배열에 각 자동차의 NSMutableDictionary 개체가 포함되도록하는 것이 전부입니다. 각 사전에는 3 개의 키 값 쌍이 있습니다. 세 가지 키는 "carName", "mostPopularColor", "secondMostPopularColor"입니다.

이전 배열 컨트롤러가 현재 개요보기에서 선택된 "Car"개체의 배열을 보유했기 때문에이 배열은 먼저 "Car"개체의 배열을 가져 와서 수행되었습니다. 이렇게하려면, 기존의 어레이 컨트롤러의 arrangedObjects의 변화가 관찰되었고, "자동차"개체의 새로운 배열을 관찰했다 :를 얻기 위해 객체를

[oldArrayController addObserver:self forKeyPath:@"arrangedObjects" options:NSKeyValueObservingOptionNew context:nil]; 

관찰을 처리하고 "자동차"의 새로운 배열을 사용하려면 사전 객체의 최종 배열은 다음 메소드가 구현되었습니다.

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {if (object == selectedChildLeafsController) 
{ 
    if ([[object arrangedObjects] count] > 0) 
    {//make a new mutable array, here called "array", of dictionaries from your array of "Car" objects which is found in [object arrangedObjects] . And then something like... 
    [self setMutableArray: array]; 
    [newArrayController bind:NSContentArrayBinding toObject:self withKeyPath:@"selectedBonds" options:nil];}else 
{ 
    [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; 
}}