15

NSTableViewバインドされている がありNSArrayControllerます。のプロパティは にバインドされていNSArrayControllerます。すべてがうまく機能します。contentSetNSMutableSet

NSTableViewここで、組み込みのアニメーションを使用して行を削除したいと考えています。私はこれを行うことができ- [NSTableView removeRowsAtIndexes:withAnimation:]、行はすぐにアニメーション化されますが、テーブルビューから削除したオブジェクトは、テーブルNSMutableSetビューをバッキングしている にまだぶら下がっています。明らかに私はそれを取り除く必要があります。NSArrayControllerのメソッドでオブジェクトを削除しようとするとremoveObject:、オブジェクトがテーブルビューからすぐに消えます。つまり、アニメーションが発生しないか、途中で途切れます。

バインディングは驚くほど機能し、物事を非常に簡単にしますが、バインディングとNSTableViewアニメーションの両方が使用されている場合、データ ソースとテーブルビューの同期を維持するための適切な方法は正確には何でしょうか? NSTableView答えは、アニメーションを使用して境界に行を追加する方法にも対処する必要があります。

4

6 に答える 6

9

アニメーションが完了した直後にモデルを更新する必要があります。

@IBAction func onRemoveClick(sender: AnyObject?) {
    let selection = listController.selectionIndexes
    NSAnimationContext.runAnimationGroup({
        context in
        self.tableView.removeRowsAtIndexes(selection, withAnimation: .EffectFade | .SlideUp)
    }, completionHandler: {
        self.listController.removeObjectsAtArrangedObjectIndexes(selection)
    })
}

バインディングを使用してアプリで動作します。OS X 10.9、10.10、10.11 でテスト済み。

于 2015-09-08T00:57:14.830 に答える
1

OS X 10.9 でこれを試してみたところ、すべて問題なく動作しているようです。これが私のコードです(ビューベースのテーブルの各行に「-」ボタンがあります:

- (IBAction)removeRow:(id)sender {
    NSUInteger selectedRow = [self.myTable rowForView:sender];
    if (selectedRow == -1) {
        return;
    }
    [self.myTable removeRowsAtIndexes:[NSIndexSet indexSetWithIndex:selectedRow] withAnimation:NSTableViewAnimationSlideUp];
    [self.myArrayHookedUpToTheNSArrayController removeObjectAtIndex:selectedRow];
}

10.9で何か変わったのかな?これらはすべてメイン スレッドから実行されています。( 内のコードを呼び出してみましたdispatch_async(dispatch_get_main_queue(), block())か?

于 2013-11-09T06:13:16.843 に答える
0

NSTableView から項目を削除するときは、mutableSet 変数も更新する必要があります。mutableSet から項目を削除するときは、NSArrayController に更新を指示する必要があります。これをする

[self willchangeValueForKey:@"mutableSet"]; //your mutableset variable Name
[self.myTable removeRowsAtIndexes:[NSIndexSet indexSetWithIndex:selectedRow] withAnimation:NSTableViewAnimationSlideUp];
[mutableSet removeObject:item];
[self didchangeValueForKey:@"mutableSet"];
于 2014-04-10T23:23:35.323 に答える
-1

あなたの質問に対するコメントでの議論から、単純な「バインディング」の適切な答えがないようです。回避策として、アニメーションを開始した直後に単純な「performSelector:withObject:afterDelay」コマンドを発行することはできませんか? 明らかに、遅延時間はアニメーションが取るログの概算であり、セレクターでは、NSMutableSet からオブジェクトを削除する場所です。

于 2012-12-03T12:10:10.870 に答える