5

単一の列でビューベース を作成しました。NSTableViewこの列にはNSTableCellView、Interface Builder の標準が表示されます (私は画像とテキスト フィールドを含むバージョンを選択しました)。

ここで、列のテキストフィールドを編集可能にしたいと考えています。

私の最初の試みは、NSTextFieldfrom Interface ビルダーを変更し、その動作をEditable. 実際、行を選択してフィールドを押すとenter key、フィールドが編集可能になり、その値を変更できます。NSTableViewDataSourceのようなメソッドの おかげでこの変更を傍受できると思っていましtableView:setObjectValue:forTableColumn:row:たが、このメソッドはテキストフィールドの編集アクションに応答して呼び出されることはありません。

ビューベースの NSTableView システムで編集可能なフィールドを処理する正しい方法はどれですか? 何か関係があると思いますがNSTableViewDataSource、そのメソッドを呼び出す方法がわかりません。

4

2 に答える 2

3

NSTableCellView のサブクラスを作成します。(適切な .h および .m ファイル) クラスが NSTextFieldDelegate プロトコルに応答するようにします。control:textShouldEndEditing: メソッドを実装します。このサブクラスをラベル コントロールのデリゲートにします。

ここにいくつかのコード例があります。

CategoryListCell.h

@interface CategoryListCell : NSTableCellView
@end

CategoryListCell.m

@interface CategoryListCell()<NSTextFieldDelegate>
@property (weak) IBOutlet NSTextField *categoryLabel;
@property (assign) BOOL editing;
@property (copy) NSString* category;
@end

@implementation CategoryListCell
- (BOOL)control:(NSControl*)control textShouldBeginEditing:(NSText *)fieldEditor {
   self.editing = YES;
   return YES;
}

- (BOOL)control:(NSControl *)control textShouldEndEditing:(NSText *)fieldEditor; {
   if (self.editing) {
        self.editing = NO;
        [self mergeFromSource:self.category toDestination:self.categoryLabel.stringValue];
   }
   return YES;
}

- (void)mergeFromSource:(NSString*)source toDestination:(NSString*) destination {
 // your work here
}

@end
于 2012-12-17T19:36:48.547 に答える
1

NSViewセル内にあるをサブクラスNSTableView化し、サブクラス化されたビューをテキストフィールドのデリゲートにする必要があるようです。NSTextField次に、ビューはデリゲートメソッドを介してテキスト変更通知を受け取ります。

- (void)textDidChange:(NSNotification *)notification;
于 2012-12-06T15:07:57.220 に答える