Я столкнулся с простой проблемой, но пока не нашел оптимального решения. У меня есть представление, основанное на NSTableView, которое загружает его представления ячеек из разных xib. Мое табличное представление динамическое и основано на пользовательском вводе. Я буду динамически добавлять и удалять строки, в конечном счете настраивая источник данных таблицы. У каждого из моих NSTableCellViews есть кнопка в нем, и я связываю обработчик кликов IBAction с NSView, который содержит представление таблицы. То, что мне нужно сделать, это получить номер строки для кнопки, которая была нажата в представлении таблицы, чтобы я мог обработать логику. Я в состоянии сделать это успешно: tableViewSelectionDidChange:(NSNotification *)notification
NSTableViewCell selectedRow number для IBAction click
Вот как я это делаю:
- (void)tableViewSelectionDidChange:(NSNotification *)notification {
NSTableView *tableView = [notification object];
NSInteger selectedRow = [tableView selectedRow];
}
Это отлично работает для пользователя фактически щелкнув строку. Теперь, когда я двигаю NSButton IBAction и связать его в NSView следующим образом:
- (IBAction)buttonClickHandler:(NSButton *)sender {
NSInteger selectedRow = [self.tblView rowForView:sender];
NSLog(@"%ld", (long)selectedRow);
}
я на основе этого подхода от this выбранного ответа.
Я также попытался это:
- (IBAction)buttonClickHandler:(NSButton *)sender {
id representedObject = [(NSTableCellView *)[sender superview] objectValue];
NSLog(@"%@", representedObject);
}
//My configuration
- (void)configureView {
[self.view setFrame:[self bounds]];
[self addSubview:self.view];
[self.view setWantsLayer:YES];
[self.view setTranslatesAutoresizingMaskIntoConstraints:NO];
self.tblView.delegate = self;
self.tblView.dataSource = self;
[self.tblView setIntercellSpacing:NSMakeSize(0, 0)];
[self.tblView registerNib: [[NSNib alloc] initWithNibNamed:@"ParentCellXib" bundle:nil] forIdentifier:@"ParentCell"];
[self.tblView registerNib: [[NSNib alloc] initWithNibNamed:@"ChildCellXib" bundle:nil] forIdentifier:@"ChildCell"];
[self.tblView registerNib: [[NSNib alloc] initWithNibNamed:@"HeaderCellXib" bundle:nil] forIdentifier:@"HeaderCell"];
}
Но изображаемый объект возвращает нуль. Если это стоит упомянуть, я установил владельца файла в качестве представления, содержащего tableView, поэтому я могу связать IBAction, и я подклассифицировал TableCellView в другой класс. Тем не менее, я не думаю, что это часть проблемы, насколько я могу судить. Есть ли простое решение, чтобы надежно дать мне выбранное число Row на основе нажатия кнопки в этой ячейке? Оба подхода, которые я попытался выше, возвращают -1 и null соответственно.
Итак, где и что не работает? Вы говорите, что работает, но не говорите, что не работает. – rocky
Я обновил сообщение, чтобы уточнить, в чем проблема. – zic10
'rowForView' должен работать. Является ли 'self.tblView' правильным и является' sender' под-представлением 'self.tblView'? Является ли NSView делегатом 'self.tblView'? Объекты внутри представлений таблицы, основанные на представлении, могут быть связаны только с делегатом таблицы. – Willeke