Как привести пользовательскую ячейку представления над строками таблицы в NSTableView?

Когда я использую настраиваемое представление как ячейку NSTableView на основе представления, пользовательский вид несколько ниже строки таблицы. Когда я нажимаю на него, вместо того, чтобы влиять на пользовательское представление элементов (например, текстовое поле), строка таблицы была выбрана (и выделена). Мне нужно отменить выбор, чтобы выбрать текстовое поле.

- (NSView*)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
    NSLog(@"We are creating views!");
    NSTableCellView *newView;
    newView = [tableView makeViewWithIdentifier:@"PostCell" owner:self];


    NSTextField *newTextField = [[NSTextField alloc] init];
    [newView addSubview:newTextField];

    return newView;
}

выделяет фронт

Когда я отключу выбор строки в соответствии с NSTableView - отключить выбор строки, выбора не было.

- (BOOL)selectionShouldChangeInTableView:(NSTableView *)tableView {
    return NO;
}

Но я все еще не могу выбрать прямо текстовое поле. Что еще хуже, я даже не могу выбрать его с помощью мыши. Работает только tab на клавиатуре.

Невозможно выбрать

Кажется, что-то над ним. Но является ли это "столбец таблицы", показанный в построителе интерфейса? Или что-то еще?

Как я могу это исправить?

Ответ 1

Используйте собственный подкласс NSTableView и переопределите -validateProposedFirstResponder:forEvent:, чтобы вернуть YES.

Смотрите эту запись в блоге от инженера Apple, который написал код представления таблицы на основе представления.

Ответ 2

Убедитесь, что присутствует следующий код.

- (BOOL)tableView:(NSTableView *)aTableView shouldSelectRow:(NSInteger)rowIndex {
return YES; 
}

Вы можете попытаться выполнить регистрацию подзаголовков. Или вы можете проверить супервизоры вида. Это поможет понять иерархию представлений.

Также на стороне заметки, если одно из параметров userInteraction просмотра отключено, то subview не сможет получать события. Пожалуйста, убедитесь, что все представления и подпрограммы userInteraction включены.

Надеюсь, это поможет.