Перенести фокус на вновь добавленную запись в NSTableView

Я пишу приложение с использованием Core Data для управления несколькими NSTableViews. У меня есть кнопка добавления, которая создает новую запись в NSTableView. Как сделать фокус перемещаться в новую запись, когда эта кнопка нажата, чтобы я мог сразу ввести имя? Это та же идея в iTunes, где сразу после нажатия кнопки добавления плейлиста фокус клавиатуры перемещается в новую строку, поэтому вы можете ввести имя плейлиста.

Ответы

Ответ 1

Хорошо, в первую очередь, если у вас его еще нет, вам нужно создать класс контроллера для вашего приложения. Добавьте выход для NSArrayController, в котором хранятся ваши объекты, и выход для NSTableView, который отображает ваши объекты, в интерфейсе вашего класса контроллера.

IBOutlet NSArrayController *arrayController;
IBOutlet NSTableView *tableView;

Подключите эти выходы к NSArrayController и NSTableView в IB. Затем вам нужно создать метод IBAction, который вызывается при нажатии кнопки "Добавить" ; назовите его addButtonPressed: или что-то подобное, объявив его в интерфейсе класса контроллера:

- (IBAction)addButtonPressed:(id)sender;

а также сделать его целью вашей кнопки "Добавить" в IB.

Теперь вам нужно реализовать это действие в реализации класса контроллера; этот код предполагает, что объекты, которые вы добавили в контроллер массива, NSString s; если они нет, замените тип переменной new на любой тип объекта, который вы добавляете.

//Code is an adaptation of an excerpt from "Cocoa Programming for
//Mac OS X" by Aaron Hillegass
- (IBAction)addButtonPressed:(id)sender
{
//Try to end any editing that is taking place in the table view
NSWindow *w = [tableView window];
BOOL endEdit = [w makeFirstResponder:w];
if(!endEdit)
  return;

//Create a new object to add to your NSTableView; replace NSString with
//whatever type the objects in your array controller are
NSString *new = [arrayController newObject];

//Add the object to your array controller
[arrayController addObject:new];
[new release];

//Rearrange the objects if there is a sort on any of the columns
[arrayController rearrangeObjects];

//Retrieve an array of the objects in your array controller and calculate
//which row your new object is in
NSArray *array = [arrayController arrangedObjects];
NSUInteger row = [array indexOfObjectIdenticalTo:new];

//Begin editing of the cell containing the new object
[tableView editColumn:0 row:row withEvent:nil select:YES];
}

Затем вызывается при нажатии кнопки "Добавить" , и ячейка в первом столбце новой строки начнет редактироваться.

Ответ 2

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

-(void)tableViewSelectionDidChange:(NSNotification *)notification {
    NSLog(@"%s",__PRETTY_FUNCTION__);
    NSTableView *tableView = [notification object];
    NSInteger selectedRowIndex = [tableView selectedRow];
    NSLog(@"%ld selected row", selectedRowIndex);

    [tableView editColumn:0 row:selectedRowIndex withEvent:nil select:YES];

т.е.

  • Реализация tableViewSelectionDidChange:(NSNotification *)notification
  • выберите выбранный индекс строки
  • Вызовите editColumn:(NSInteger)column row:(NSInteger)row withEvent:(NSEvent *)theEvent select:(BOOL)select оттуда с индексом строки.

Важное примечание: это решение также инициирует редактирование, когда пользователь просто выберет строку. Если вы хотите, чтобы редактирование запускалось при добавлении нового объекта, это не для вас.