1

NSOutlineView で発生する奇妙な問題があります。ビューは基本的に、子として関連付けられたファイルを持つアプリのリストです。ビューをデータソースに手動で入力すると、すべて正常に機能します。私が今やりたいことは、アイテムを削除するためのボタンを用意することです。それを行うために、removeAppOrFile メソッドを次のように実装しました。

- (IBAction)removeAppOrFile:(id)sender
{
    NSInteger selectedRow = [myView selectedRow];
    if (selectedRow == -1) //ie. nothing's selected
    {
        return;
    }  
    NSTableColumn *col = [myView tableColumnWithIdentifier:@"Column 1"];
    NSCell *cell = [col dataCellForRow:selectedRow];
    NSString *item = [cell stringValue];
    NSLog(@"The row is: %ld\nThe column is: %@\nThe cell is: %@\nThe selected item is: %@",selectedRow, col, cell, item); // For testing purposes
}

myView は、NSOutlineView に接続された IBOutlet です。別の行を選択してボタンをクリックすると、selectedRow の値は適切に変更されますが、NSCell オブジェクトは決して変更されず、その値 (つまり、NSString アイテム) は常に最後の表示アイテムの値を示します (つまり、最後のアイテム NSString アイテムとして子を持つアイテムは、展開されていない場合は親になり、展開されている場合は最後の子になります)。

奇妙なことは、NSOutlineView の doubleAction に基本的に同じコードを他の場所で使用していて、完全に機能することです。その場合、コードは次のようになります。

- (void)editedAppOrFile:(id)sender 
{
    NSInteger rowNumber = [sender clickedRow];
    NSTableColumn *col = [sender tableColumnWithIdentifier:@"Column 1"];
    NSCell *cell = [col dataCellForRow:rowNumber];
    NSString *item = [cell stringValue];
    NSLog(@"The row is: %ld\nThe column is: %@\nThe cell is: %@\nThe selected item is: %@",selectedRow, col, cell, item); // For testing purposes
}

この場合、送信者は OutlineView です。行番号の変更に伴うアイテムとセルの変更。

最初の例でなぜ機能しないのかについて何か考えはありますか?

4

1 に答える 1

3

あなたのアプローチにはいくつかの問題があります。

  1. ではなくデータセルを取得している-preparedCellAtColumn:row:ため、その内部オブジェクト値がどうなるかについての保証はありません。
  2. アウトラインビューに直接問い合わせることができます-itemAtRow:
  3. 削除(最初のケース)または編集(2番目のケース)しようとしている場合は、実際にはデータソースを変更してから、変更された行数をメモする(最初のケース)か、行のデータをリロードする(2番目のケース)だけです。 。
于 2011-08-19T15:46:54.740 に答える