2010-05-12 7 views
2

NSDictionaryController에 바인딩 된 NSTableView가 있습니다. 인터페이스 빌더를 통해이 내용 사전을 설정했습니다. 내가 가지고있는 질문은 컨트롤러가 자동으로 그것을보고 테이블에 표시하는 방식으로 사전에 개체를 추가하는 방법입니다.NSDictionaryController에 객체 추가

NSArrayController에 대한 예제에서 실제 배열이 아닌 컨트롤러를 통해 새 객체를 추가하여 컨트롤러가 변경 사항을 인식하도록했습니다. 그러나, 나는 dictionarycontroller로 이것을하는 유사한 방법을 보지 못한다 ...

도움을 주셔서 감사합니다.

답변

4

글쎄, 나는 이것을 알아 냈다. 나는 arraycontroller가 dictionarycontroller가 똑같이 할 것이지만 그것이 그렇게하지 않는다는 배열의 사용을 미러링했기 때문에 알게되었습니다. 이 과정은 ...

조금 다르다 그래서 당신은 당신이 그래서 아무것도 사용 그것에 다음 프로세스 바인딩 업데이트 할 수 있습니다 값을 추가하고 싶습니다 dictionarycontroller있는 경우 :

//Creates and returns a new key-value pair to represent an entry in the 
//content dictionary. 
id newObject = [dictController newObject]; 
//Use NSDictionaryControllerKeyValuePair Protocol setKey 
[newObject setKey:@"Key"]; 
//Use NSDictionaryControllerKeyValuePair Protocol setValue 
[newObject setValue:@"value"]; 
//Add the object to the controller 
[dictController addObject:newObject]; 

이를 사실상 dictionarycontroller를 업데이트하고 값을 내용 사전에 추가합니다. setValue : ForKey는 NSDictionaryControllerKeyValuePair 프로토콜에 구현 된 메서드가 아니기 때문에이 경우 사용할 수 없습니다.

저는이 컨트롤러를 사용하는 다른 사람들에게 도움이되기를 바랍니다.

+0

이 나를 위해 일했다,하지만 좀 더 내가 http://stackoverflow.com/questions/1596229/nsdictionarycontroller-doesnt-seem-to을하고 싶어 무엇을 정렬 듯이 질문에 발견 -observe-contents-dictionary- – TodK

0

구현에있어 [newObject setValue : @ "value"] 행에 오류가 발생하여 여러 메서드가 일치하지 않는 결과가 발견되어 아무 것도 찾을 수 없다는 이유로 jasons 응답이 작동하지 않았습니다. 새 항목을 의도 한대로 추가하는 다른 방법. 그냥이 같은 dictController 업데이트해야 바인딩마다, 갱신 :

내가이 솔루션을 내놓았다 검색과 노력이 많이 후

[dictController bind:NSContentDictionaryBinding toObject:self withKeyPath:@"nameOfMyDictionary" options:nil]; 

그렇게 내 코드를 통해 내가 항목을 추가 내 사전, 그리고 내 사전의 내용과 테이블을 보여주는 바로 전에 바인딩을 재설정. 이것은 아마도 더러운 해결책이지만 그것은 나를 위해 일했습니다.

+0

이 문제를 이해함에 따라 문제는 NSMutableDictionary가 자체적으로 알림을받는 키 값을 게시하지 않는다는 것입니다. 행복하게 "무엇이든지"의 핵심이 바뀔 것이라고 말하지만, "내가 바뀌 었습니다"라고 말하지는 않습니다. 즉, 바인딩 된 개체는 사전의 임의의 돌연변이에 대한 알림을받지 않으므로 자체를 업데이트 할 수 없습니다. 따라서 콘텐츠를 업데이트 할 때마다 콘텐츠에 할당하면됩니다. 컨텐트 사전을 편집하기 전후에 willChangeValueForKey : didChangeValueForKey를 호출 할 수도 있습니다. –

0

우수! Swift3에 대한 수정 :

// Use NSDictionaryControllerKeyValuePair Protocol setKey 
    let temp = myDictionaryController.newObject() 
    temp.setValue(name, forKey: "key") 
    temp.setValue(list, forKey: "value") 
    myDictionaryController.addObject(temp)