0

얼마나 쉽지 않을 수 있습니다.새로 생성 된 NSManagedObject에서 필수 관계를 채우는 코어 데이터

저는 매우 간단한 데이터 모델로 문서 기반 코어 데이터 응용 프로그램을 보유하고 있습니다.

NSTreeController가 제어하는 ​​부모/자식 관계가있는 "노드"엔티티가 있으며 NSOutlineView를 통해 열어 보았습니다. 또한 "노드"는 NSArrayController에 의해 관리되는 다른 엔티티 유형 "nodeProperties"에 대한 비 선택적 (1 대) 관계를가집니다. 엔티티 모두에 NSManagedObject 하위 안경이 있습니다. 내 문서 클래스에는 트리 컨트롤러 및 배열 컨트롤러 인스턴스에 바인딩 된 콘센트가 있습니다.

내 문제는 개요보기의 사용자 인터페이스 동작에 의해 새로운 "노드"가 만들어지면 적절한 (기존) nodeProperties 개체와의 관계가 채워지도록하는 방법입니다. 생각 나는 시도

접근/:

  1. 트리 컨트롤러는 "노드"를 만들어 보자 (는 추가 :,하는 AddChild에서 : 행동)과 "노드"에 개체입니다 nodeProperties의 관계를 채울 awakeFromInsert 메소드의 서브 클래스. 문제는 "노드"의 awakeFromInsert 내에서 nodeProperties 객체에 액세스 할 수있는 방법을 찾을 수 없다는 것입니다. "적절한"nodeProperties 객체는 문서 클래스의 메서드에서 사용할 수 있지만 노드 awakeFromInsert 메서드에서 문서 객체에 액세스하면 MVC의 원칙을 위반하는 것처럼 보입니다. 공유 문서 객체가 드래그에서 항상 안전하지는 않다는 것을 읽었습니다 (내 경우에는 새로운 노드 객체를 생성합니다)

  2. 문서 클래스에 add : and addChild : action 메소드를 추가하고 트리 컨트롤러 대신 최종 사용자 작업에서 호출합니다 (내 드래그 앤 드롭 지원은 문서 클래스에도 있습니다.) 그런 다음이 메소드 내에서 트리 컨트롤러에서 add : 및 addChild : 메소드를 호출 한 다음 새로 작성한 노드에서 nodeProperties 관계를 설정하십시오. 문제는 새로 생성 된 노드에 대한 참조를 트리 컨트롤러에 요청하는 방법을 모른다는 것입니다. selectedObjects 메서드를 사용하여 부모를 얻은 다음 추가하기 전과 후에 부모 노드를 비교하여 새 노드를 가져 왔습니다. 그러나 아이들의 콘텐츠는 이번에 변경되지 않습니다 - 아마도 업데이트가 지연 되었습니까?

  3. 2의 변형으로서, 트리 컨트롤러 add :/addChild : 메소드를 사용하지 말고 add :/addChild : 문서에서 노드 엔티티 객체를 작성하십시오. 트리 컨트롤러를 사용하는 메소드 selectedOjects to get 부모. 나는 나무 콘트롤러 뒤에서 뭔가를하는 것처럼 보이기 때문에 이것을 정말로 좋아하지 않는다. 그리고 나는 루트 객체를 만들 때마다 setContent :를해야 할 것이다.

  4. 나는 새로 생성 된 노드의 생성을 관찰 할 가능성을 고려했지만,이를 달성하기 위해 무엇을 관찰해야할지 모르겠다.

누군가는 이런 식으로 뭔가를 했어야했는데 아무 소용이 없었습니다. 모든 도움, 조언,지도는 대단히 환영 할 것입니다.

+0

Re : 2 -'InsertChild'는 runloop에서'dispatch_async'와 같은 일정으로 스케줄 된 것처럼 보입니다. 당신은'dispatch_async'를 사용하여'insertChild'에 이어 당신 자신의 코드 블록을 가져올 수 있습니다. – stevesliva

+0

내가 선호하는 방법은 부모 항목에서 childrenKeyPath를 업데이트하여 childrenSet의 변경 사항을 관찰하고 거기에 새로운 자식을 추가하는 방법에 우선합니다. – stevesliva

답변

0

많은 트롤링과 실험 후에 대답은 3의 변형입니다.이것이 그 관심이 들어

: 문서 추가를하는 AddChild 동작 방법에서, 그 의무 관계를 채우고, 새로운 노드를 만든 다음 방법

NSTreeController은 insertObject 사용하여 트리 컨트롤러에 노드를 삽입합니다 atArrangedObjectIndexPath를 문서 클래스의 addChild 메소드. 그것은 내 데이터 모델

- (IBAction)addChildAction:(id)sender 
{ 
    NSArray *indexPaths = [nodeTreeController selectionIndexPaths]; 
    NSArray *selectedObjects = [nodeTreeController selectedObjects]; 
    for (NSUInteger i = 0; i < [indexPaths count]; i++) 
    { 
     QVXpandNode *parentNode = [selectedObjects objectAtIndex:i]; 
     if ((parentNode) && ([parentNode.isMaster boolValue])) // can only add nodes under the master node 
     { 
      QVXpandNode *createdNode = [self createPopulatedNode]; 
      // Dont belelieve below is safe when >1 selected, 
      // since adding a new node will result in the tree paths changing? 
      // Hmmm but I do want to support multiple selection addition?? 
      [nodeTreeController 
       insertObject:createdNode 
       atArrangedObjectIndexPath:[[indexPaths 
        objectAtIndex:i] indexPathByAddingIndex:[parentNode.children count]]]; 
     } 
    } 
} 

당신은> 1 개 행이 작업을 호출하기 전에 선택한다면 내가 옳은 길에서 두 번째 이후 자녀를 넣을 것인지 확실치 것을 볼 수에서 몇 가지 특성을 가지고있다.

addSibling 메서드는 마지막 인덱스 경로 값을 계산할 필요가 있기 때문에 약간 더 복잡하지만 그렇지 않으면 비슷합니다. 누구든지보고 싶다면 재현 할 수 있지만 새로운 트리 노드에서 필수 관계를 채우는 열쇠는 문서 클래스에서이를 수행 한 다음 트리에서 삽입하려는 트리의 위치를 ​​트리 컨트롤러에 정확하게 알려주는 것입니다.