NSButtonCell, созданный программно, не выделяется при нажатии - PullRequest
1 голос
/ 23 июня 2010

Я хотел, чтобы кнопка отображалась в табличном представлении в качестве первого элемента в последней строке вместо обычных данных, поэтому я создал подкласс NSTableView и перезаписал подготовленныйCellAtColumn: row: метод для генерации желаемого поведения в последний ряд.

- (NSCell *)preparedCellAtColumn:(NSInteger)column row:(NSInteger)row {
    if(row < [self numberOfRows]-1) {
        return [super preparedCellAtColumn:column row:row];
    } else {
        // if we're on the last row, we're going to add the button instead of data
        if(column == 0) {
            NSButtonCell *button = [[NSButtonCell alloc] initTextCell:self.buttonTitle];
            [button setEditable:YES];
            [button setSelectable:YES];
            [button setBezelStyle:NSTexturedSquareBezelStyle];
            [button setGradientType:NSGradientConvexWeak];
            [button setButtonType:NSMomentaryPushInButton];
            [button setHighlightsBy:NSBackgroundStyleLowered];
            [button setAction:@selector(openAddDialog)];
            [button setControlView:self];
            return button;
        } else {
            NSTextFieldCell *emptyCell = [[NSTextFieldCell alloc] initTextCell:@""];
            [emptyCell setEditable:NO];
            [emptyCell setSelectable:NO];
            return emptyCell;
        }
    }
}

К счастью, функционал работает - кнопка появляется в последнем ряду и при нажатии вызывает селектор openAddDialog. Однако есть две визуальные проблемы:
1. Кнопка не подсвечивается (нажимается) при нажатии.
2. Таблица выбирает строку с кнопкой при ее нажатии.
Я все еще довольно новичок в Objective C и Cocoa, поэтому я не совсем уверен, где искать решения для них. Почему при нажатии кнопки метод setHighlighted кнопки не вызывается? Какой метод вызывается непосредственно перед тем, как NSTableView выберет строку, чтобы я мог переопределить ее и запретить выбирать последнюю строку?

В итоге я решил свой второй вопрос, переопределив функцию selectRowIndexes: byExtendingSelection: в моем подклассе таблицы и просто не передав индекс последней строки в суперфункцию.

1 Ответ

0 голосов
/ 23 июня 2010

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

Кстати, обычно плохо ставить какой-то элемент управления в конце таблицы, особенно тот, который влияет на всю таблицу.Таблицы должны состоять из логических повторяющихся единиц.Помещение чего-то уникального в таблицу вызывает путаницу среди пользователей и может скрыть функциональность.Скорее всего, вы хотите переместить кнопку за пределы самой таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...