17

NSOutlineView単一のアイテム プロパティを変更し、最初は[myOutlineView reloadData].

試してみ [myOutlineView reloadItem: myOutlineViewItem]ましたが、呼び出さ- (NSView *)outlineView:(NSOutlineView *)ov viewForTableColumn:(NSTableColumn *)tableColumn item:(id)itemれないため、データが更新されません。

-(void)reloadOutlineViewObject
{
    //[myOutlineView reloadData];   //Reload data just fines but is ressource-hungry
    NSLog(@"%d",[myOutlineView rowForItem:myOutlineViewItem]; //Making sure my object is an item of the outlineView, which it is !
    [myOutlineView reloadItem:myOutlineViewItem];   
}

ここで何か不足していますか?

アップデート

コメントで指摘されているように、私の OutlineView はビューベースです。

更新 2

いくつか試してみると、リロードしているオブジェクトが第 2 レベルのオブジェクト (オブジェクト ツリーを参照) であり、呼び出しreloadItem:firstLevelObject reloadChildren:YESが機能することがわかりました。

第 1 レベルの object でのみ reloadItem: を呼び出すことができる可能性はありますか? 私の場合、それは非常に非効率的です(2レベルのアイテムが1つしかなく、2番目のレベルがたくさんあります)!

nil ->firstLevelA ->secondLevel1
                  ->secondLevel2
    ->firstLevelB ->secondLevel3
                  ->secondLevel4

NSOutlineView をサブクラス化reloadItem:し、その間に書き直そうとします。

更新 3

まず、Cocotron の NSOutlineViewを調べてみたところ、reloadItemを上書きするために記述する必要があるコードはかなり重いものになると感じました。誰でも確認できますか?

4

4 に答える 4

16

ビューベースのアウトライン ビューでも同じ問題が発生しました-reloadItem:reloadItemドキュメントには、その行のビューを再取得すると明示的には書かれていませんが、これは間違いなく大きなバグのようです。

私の回避策は、代わりにNSTableView'sを呼び出すことでした。これは期待どおりに機能するようで、その項目だけのデリゲート メソッド-reloadDataForRowIndexes:columnIndexes:への呼び出しをトリガーします。リロードする項目を呼び出して渡すことで、-outlineView:viewForTableColumn:item:リロードする必要がある行を取得できます。-rowForItem:

于 2014-03-18T21:53:56.927 に答える
10

これは実際にはバグではありません。これは私が明示的に設計したものです。私の考えでは、reloadItem (など) は、そのアイテムのテーブル セルではなく、アウトライン ビュー アイテムのプロパティをリロードするだけでよいと考えていました。これは、リロードする対象に関する特定の情報 (リロードする特定のセルなど) が十分にないためです。reloadDataForRowIndexes:columnIndexes: を使用して、特定のビュー ベースのテーブルビュー セルをリロードすることを意図していました。基本クラスが数行のコードで同じことを簡単に実行できる場合、通常はカバー メソッドを提供しません。

ただし、そうは言っても、複数の人がこれについて混乱していることは知っており、ほとんどの人はセルもリロードすることを期待しています.

これを変更するよう Apple に要求するバグを記録してください。

ありがとう、-コービン

于 2016-03-28T14:24:27.203 に答える
2

reloadItem:macOS 10.12 でのみ動作します。

リリースノートから: https://developer.apple.com/library/content/releasenotes/AppKit/RN-AppKit/

NSOutlineView は、[outlineView reloadItem:] が呼び出されたときに、'item' に関連付けられたセル ビューをリロードするようになりました。このメソッドは、[outlineView reloadDataForRowIndexes:columnIndexes:] を呼び出すだけで、再ロードする特定の行とすべての列を渡します。互換性のために、これは 10.12 SDK にリンクするアプリケーションでのみ機能します。

そのため、以前のシステムで行をリロードする場合は、-reloadDataForRowIndexes:columnIndexes:. そんな感じ:

let index = outlineView.row(forItem: obj)
let rowIndex = IndexSet(integer: index)

let cols = IndexSet(0 ... outlineView.numberOfColumns) 

outlineView.reloadData(forRowIndexes: rowIndex, columnIndexes: cols)
于 2016-12-15T14:00:44.627 に答える