Xcode8.3のswiftを使用してMacOSXアプリ作成の勉強をしております。
NSOutlineViewの子アイテム(子ノード)を表示させる方法が分からないので分かる方がいましたら教えてください。
プログラムは以下のサイトを参考にさせていただきました。
https://stackoverflow.com/questions/43829243/swift-3-nsoutlineview-with-expandable-items
ただ、動作させてみると親アイテムを選択した時に▲矢印の向きは変わりますが、子アイテムが表示されない状況です。
下記画像のように2行目(Index 2の項目)を選択していますが
子アイテムが表示されません。
(正しく動作するイメージとしてはindex 2項目の下に「index 2.1」、「index2.2」、「index2.3」と子項目を表示したいと考えて居ます。)
NSOutlineViewの設定としては以下のように設定しております。
私が書いたコードとしては以下のようなものになります。
swift3
1import Cocoa 2 3class ViewController: NSViewController, NSOutlineViewDataSource, NSOutlineViewDelegate { 4 5 let items: [Item] = { 6 return Item.itemsForNumberOf(parents: 5, childrens: 3) 7 }() 8 9 @IBOutlet var outlineView: NSOutlineView! 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 14 // Do any additional setup after loading the view. 15 self.outlineView.delegate = self 16 self.outlineView.dataSource = self 17 } 18 19 override var representedObject: Any? { 20 didSet { 21 // Update the view, if already loaded. 22 } 23 } 24 25 func outlineView(_ outlineView: NSOutlineView, child index: Int, ofItem item: Any?) -> Any 26 { 27 if item == nil { 28 return items[index] 29 } 30 31 if let item = item as? Item, item.childrens.count > index { 32 return item.childrens[index] 33 } 34 35 return "" 36 } 37 38 func outlineView(_ outlineView: NSOutlineView, isItemExpandable item: Any) -> Bool 39 { 40 guard let item = item as? Item else { 41 return false 42 } 43 44 return !item.childrens.isEmpty 45 } 46 47 func outlineView(_ outlineView: NSOutlineView, numberOfChildrenOfItem item: Any?) -> Int 48 { 49 if item == nil { 50 return items.count 51 } 52 53 if let item = item as? Item { 54 return item.childrens.count 55 } 56 return 0 57 } 58 59 func outlineView(_ outlineView: NSOutlineView, viewFor tableColumn: NSTableColumn?, item: Any) -> NSView? 60 { 61 guard let item = item as? Item else { 62 return nil 63 } 64 65 let v = outlineView.make(withIdentifier: "HeaderCell", owner: self) as? NSTableCellView 66 67 if let tf = v?.textField { 68 tf.stringValue = item.name 69 } 70 return v 71 } 72 73 struct Item { 74 let name: String 75 var childrens: [Item] = [] 76 77 /// Create a helper function to recursivly create items 78 /// 79 /// - Parameters: 80 /// - parents: number of parent items 81 /// - childrens: number of children for each parent item 82 /// - Returns: array of Item 83 static func itemsForNumberOf(parents: Int, childrens: Int) -> [Item] { 84 var items: [Item] = [] 85 for parentID in 1...parents { 86 var parent = Item(name: "Index \(parentID)",childrens: []) 87 for childrenID in 1...childrens { 88 let children = Item(name: "Index \(parentID).\(childrenID)",childrens: []) 89 parent.childrens.append(children) 90 } 91 items.append(parent) 92 } 93 94 return items 95 } 96 } 97}
もし分かる方がいましたら教えていただけないでしょうか?
よろしくお願い致します。
回答2件
あなたの回答
tips
プレビュー