2014-11-19 3 views
3

Согласно Apple's documentation on [NSTableViewDelegate tableView:shouldEditTableColumn:row:], «этот метод действителен только для табличных представлений на основе NSCell». Каков его эквивалент для табличных представлений на основе представления? Я хотел бы заменить встроенное редактирование по умолчанию с помощью специального редактирования.tableView: shouldEditTableColumn: строка: для NSTableView на основе представления

+0

Вы нашли ответ? – Wesley

+0

Ожидается, что представления таблиц на основе представлений будут использовать 'NSImageView',' NSTextField', 'NSImageView' и т. Д. Для своих ячеек, поэтому не имеет смысла иметь' [NSTableViewDelegate tableView: shouldEditTableColumn: row:] 'что-то больше связано с редактированием текста (по умолчанию в ячейках представления используются «NSTextFieldCell» для ячеек, и он содержит только текст). Если вы хотите контролировать редактирование текстовой ячейки, вы можете использовать 'NSTextField' и установить' [NSTextField setEditable: NO] '. – VolenD

ответ

2

В этом делетете нет необходимости в представлении таблиц на основе представления.

В этом случае вам необходимо создать, например, некоторый подкласс NSView. Также может быть nib-файл.

Предположим, у вас есть класс с именем CustomCellView, имеющий несколько точек. CustomCellView.h файл

#define kCustomCellViewReusableIdentifier @"kCustomCellViewReusableIdentifier" // NSTableView reuses cell views 

@interface CustomCellView : NSView 

@property (weak) IBOutlet NSImageView *imageView; 
@property (weak) IBOutlet NSTextField *textField; 

- (void)setCellEditable:(BOOL)editable; 

@end 

Вот ваш CustomCellView.m файл

@implementation CustomCellView 

- (void)awakeFromNib 
{ 
    // paste your ui initializing code here 
} 

- (void)prepareForReuse 
{ 
    // this method will call each time cell reuses 
} 

- (void)setCellEditable:(BOOL)editable 
{ 
    [self.textField setEditable:editable]; 
    // some other code 
} 

@end 

Не забудьте создать острия-файл и подключить розетки. У вашего класса NSTableView должен быть некоторый код инициализации для повторного использования. MyTableViewController.m

- (void)initUI 
{ 
    NSString *nibName = NSStringFromClass([CustomCellView class]); 
    [self.tableView registerNib:[[NSNib alloc] initWithNibNamed:nibName bundle:nil] 
       forIdentifier:kCustomCellViewReusableIdentifier]; 
} 

#pragma mark - table view data source methods 

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row 
{ 
    CustomCellView *view=[tableView makeViewWithIdentifier:kCustomCellViewReusableIdentifier owner:nil]; 
    [view setCellEditable:someCondition]; // 
    return view; 
} 

#pragma mark - operations 

- (void)setViewAtColumn:(NSTableColumn *)tableColumn row:(NSInteger)row editable:(BOOL)editable 
{ 
    CustomCellView *view=[self.tableView viewAtColumn:tableColumn row:row makeIfNecessary:NO]; //no need to create it if it's not exists - we'll set the data in NSTableViewDataSource method 
    if (view) // if it's exists 
    [view setCellEditable:editable]; 
} 
1

Комментируя подход отеля Astoria:

inconvient «проблема» с необходимостью изменить редактируемость текстового поля, когда редактируемость изменения модели является то, что вы должны «активно» отслеживать редактируемость модели и обновление редактируемости текстового поля.

В отличие от подхода делегата табличного представления, который требует редактирования, до тех пор, пока пользователь не попытается сделать редактирование, в этот момент делегат просто вернется, может ли модель быть отредактирована или нет. Там гораздо меньше настроек и меньше возможностей для совершения ошибки. (например, в зависимости от того, как вы контролируете/отвечаете на редактируемость в модели, вы можете пропустить изменение, и теперь пользователь может неправильно редактировать или не редактировать поле.)

Таким образом, другой подход заключается в воссоздании делегации определения редактируемости в момент, когда пользователь пытается отредактировать. Для этого вы должны подклассифицировать NSTextField, переопределить «правое пятно», спросить делегата и разрешить или запретить редактирование.

«Правильное пятно», по-видимому, будет отменено acceptsFirstResponder и возвращает НЕТ.

- (BOOL)acceptsFirstResponder 
{ 
    BOOL accepts = [super acceptsFirstResponder]; 

    if (accepts) { 
     if ([self.delegate respondsToSelector:@selector(textFieldShouldBecomeEditable:)]) { 
      accepts = [self.delegate textFieldShouldBecomeEditable:self]; 
     } 
    } 

    return accepts; 
} 

С учетом указанных выше, до тех пор, как ДА, делегат называется полем editable-х, чтобы иметь окончательное решение.

В зависимости от вашего приложения это может быть более желательным, потому что мониторинг изменений в редактируемости модели не является прямым. Однако, как правило, лучше всего использовать стандартный подход, просто устанавливающий свойство поля editable.

Смежные вопросы