2017-01-06 8 views
0

NSTreeController에서 동적으로 업데이트 된 데이터를 가져 와서 정상적으로 작동합니다. 내가 할 수없는 일은 NSOutlineView에서 사용자 선택을 기반으로 거기에서 거꾸로 작업하는 것입니다.NSOutlineView에서 NSTreeController 데이터 가져 오기 선택

var deviceStore = [TreeNode]() 

그것은 어린이 등 Service 객체의 배열을 포함 할 수있다) 또는 수도 없습니다) Device 객체의 배열입니다 실시간으로 업데이트되는 내 백업 데이터 저장소입니다.

이 모두 작동합니다. 그러나 Outline View에서 한 행을 선택할 때 back을 deviceStore의 원본 객체에 적용해야합니다. 또는 적어도 OutlineView에서 표시된 데이터를 가져와 deviceStore를 걸을 수 있습니다. ~에 원래 항목을 찾으십시오.

내가 선택한 것은 treeController.selectedNodes을 통해 NSTreeController TreeNode를 추출 할 수 있지만 선택 항목을 만들 때 호출되는 func outlineViewSelectionDidChange(_ notification: Notification) {}입니다.하지만 거기에서 나는 잡초에 속합니다. selectedNodes는 선택한 노드의 전체 배열이므로 자식 (리프) 노드 인 경우 상위 노드와 모든 형제를 포함합니다.

다음 표는 여기에 표시 줄 : OutlineView

selectedNodes 배열은 다음과 같습니다

<NSTreeControllerTreeNode: 0x6080000c4590>, child nodes { 
    0:<NSTreeControllerTreeNode: 0x6000000ca6b0>, child nodes { 
     0:<NSTreeControllerTreeNode: 0x6000000caf70>, child nodes {} 
     1:<NSTreeControllerTreeNode: 0x6000000cafe0>, child nodes {} 
     2:<NSTreeControllerTreeNode: 0x6000000cb050>, child nodes {} 
    } 
    1:<NSTreeControllerTreeNode: 0x6080000d1790>, child nodes { 
     0:<NSTreeControllerTreeNode: 0x6000000cce80>, child nodes {} 
    } 
} 

그리고 selectedIndex의 내가 다시 연락하는 방법을 볼 수 없습니다 4.

입니다 내 데이터 모델에서이 정보로부터 deviceStore [0] .serviceStore [2]가 될 것입니다.

선택한 행에서 서비스 ID 열의 값을 검색 할 수 있으면 deviceStore 트리를 탐색하여 찾을 수 있습니다.

나는 아직 찾지 못했지만 간단하고 우아하고 쉬운 방법이 있다고 확신하지만 NSTreeController 초와 NSOutlineView 초를 잃었습니다.

답변

0

사실은 다시 TreeController에 T의 경우 사용자가 클릭에 baed 백업 저장 데이터를 얻을 수 없었어 보기. 내가 이었던 것은이었습니다. 데이터를 거꾸로 작업하는 것이 었습니다.

func outlineViewSelectionDidChange(_ notification: Notification) { 
    let selectedIndex = (notification.object as AnyObject).selectedRow! 
    let selCol1 = outlineView.view(atColumn: 0, row: selectedIndex, makeIfNecessary: false)?.subviews.last as! NSTextField 
    let selCol2 = outlineView.view(atColumn: 1, row: selectedIndex, makeIfNecessary: false)?.subviews.last as! NSTextField 

    let devName = selCol1.stringValue 
    let devID = selCol2.stringValue 
... 
} 

는 그때 거리 '를 deviceStrore 배열 나는 거기에 devNamedevID을 찾을 때까지 적절하게 처리 할 수있다.

아마 가장 우아한 해결책은 아니지만 적어도 결국에는 효과가 있습니다.

1

당신은 다음과 같이 직접적으로 연관된 객체 (들)에 액세스하려고 할 수 있습니다 :

let selectedService = treeController.selectedObjects.first as? Service 

워드 프로세서 are here. 또한

확인하여 NSTreeController 제대로 클래스의 개체를 사용하도록 구성되어 있습니다 : (당신은 당신의 데이터 소스와 직접 작업 할 경우) 당신이 선택한 개체의 get the index path 할 수 있습니다 또는

enter image description here

NSTreeController에서 :

var selectionIndexPath: IndexPath? { get } 
+0

감사를 다음 사용합니다. 'let selectedService = treeController.selectedObjects.first as? treeController.selectedObject가'Service' 객체가 아니고'Device' 객체도 아니기 때문에 Service는 훌륭하게 실패합니다. 사실, 두 객체는 ​​모두 사용자 정의'TreeNode' 프로토콜을 사용 합니다만,'TreeNode' 객체조차 아닙니다. 실제로'ViewNode' 프로토콜을 구현하는'ViewController' 객체입니다. selectionIndexPath ** always **는 인덱스 경로 값 0을 반환합니다. 나는 이상하게 여기고 있습니다. – Davidgs

+0

가능한 한 응답을 편집했습니다. 트리 컨트롤러가 올바른 개체를 "제공"하지 않는 이유에 대한 설명. –

0

나는, 핵심 데이터와 답장을

func outlineViewSelectionDidChange(_ notification: Notification) { 
    let item = outlineView.item(atRow: outlineView.selectedRow) as! NSTreeNode 
    let fileItem = item.representedObject as! FileItemMO 

    // Do what you need to do with object fileItem 
    // fileItem has a relationship content to ContentMO 

    if let content = fileItem?.content { 
     let text: String = content.text! 
     print(text) 
    } 
}