1

return キーを使用して新しい行を追加する 1 つの文字列列を持つ単純なテーブルが必要です。また、ユーザーが特定の行のテキストもクリアした場合、行を削除したいと考えています。

このメソッドを使用して、リターン キーを使用して新しい行を追加することができました。

-(BOOL)control:(NSControl*)control textView:(NSTextView*)textView doCommandBySelector:(SEL)commandSelector{
if (commandSelector == @selector(insertNewline:)) {
    [self returnKey];
    return YES;
}
else if(commandSelector == @selector(moveUp:)){
    [self tableMoveUp];
    return YES;
}
else if(commandSelector == @selector(moveDown:)){
    [self tableMoveDown];
    return YES;
}
else{
    NSLog(@"%@", NSStringFromSelector(commandSelector));
}

return NO;

}

問題は、ユーザーが行のテキストをクリアしてリターン キーを押したときに行を削除することです。このメソッドは、テーブルの実際の変更がデータ ソースに保存される前に呼び出されています。次のように、列の dataCell を取得しようとしました。

NSTextFieldCell *cell = [self.tableView.tableColumns[0] dataCell];
NSLog(@"%@",cell.stringValue);

しかし、stringValue は正確ではありません。これを達成する方法についてのアイデアはありますか? ありがとうございました!

4

1 に答える 1

0

テーブル列のデータ セルは各行で再利用されるため (その値を設定し、描画、泡立て、すすぎ、繰り返しの際に所定の位置に「スタンプ」します)、この種のコードを配置するのは奇妙な場所です。「stringValue は正確ではありません」という観測は、これに対する大きな手がかりです。セルが最後に描画に使用された値に設定されますが、これは決定できませんし、決定すべきではありません。

データ ソースで管理しないのはなぜですか。-tableView:setObjectValue:forTableColumn:row: が呼び出されると、obj が空の文字列/nil/何でもかどうかを確認し、その行を削除してリロードします。「このセルを空にする」はユーザー アクションです。テーブル ビューはそれを処理し、ユーザーがいつ変更をコミットしたかをデータ ソース (コントローラー) に知らせます。

「delete/backspace で行を削除」したい場合は、NSTextFieldCell をカスタマイズして「MyTableRowWasDeleted」通知を送信します。これをデータ ソースが監視し、適切な手順を実行して編集を終了し、「空の」行を削除してからリロードします。

于 2013-05-03T20:36:51.077 に答える