質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Cocoa

CocoaはMac OS X用のアプリケーションを構築する為の主要なフレームワークのひとつです。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

487閲覧

NSOutlineViewの子アイテムを表示する方法について

misakiti

総合スコア15

Cocoa

CocoaはMac OS X用のアプリケーションを構築する為の主要なフレームワークのひとつです。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2017/08/29 21:01

編集2017/09/09 13:57

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}

もし分かる方がいましたら教えていただけないでしょうか?
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Stripe

2017/09/09 13:10

「func outlineView(_ outlineView: NSOutlineView, numberOfChildrenOfItem item: Any?) -> Int」の戻り値は、ほとんどのケースで0になりませんか?
misakiti

2017/09/09 13:18

ご覧いただきありがとうございました。こちらで確認しました所、上記記載のプログラムの場合、該当箇所は1回だけ処理を実行し、その時は「5」の値を返しておりました。
Stripe

2017/09/09 13:32

いや、そういう話をしているつもりはないんですが(笑) そのメソッドの意味を理解するところから始めてください。
misakiti

2017/09/09 13:58

ご返事いただきありがとうございました。一部ソースの記述が漏れていたので正常に動作しておりませんでした。
guest

回答2

0

自己解決

質問内容に記載したソースコードで正常動作することを確認しました。

投稿2017/09/09 13:58

misakiti

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

質問者のコードを見ているのでは?
回答(ベストアンサー)を見て下さい。

ベストアンサーのコードを見ているのにうまくいかないのであれば、あなたのコードを書いて下さい。

投稿2017/08/30 08:27

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

misakiti

2017/09/09 12:58

返信が遅くなりすみません。 この度はご回答いただきありがとうございました。 今回使用したものは、ベストアンサーのコードを参考にしております。 私自身が書いたコードを質問内容に追記させていただきました。 もし、分かるようであればご回答いただけると幸いです。 どうぞよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問