Переместить фокус на вновь добавленную запись в NSTableView - PullRequest
13 голосов
/ 10 мая 2009

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

Ответы [ 3 ]

18 голосов
/ 10 мая 2009

Хорошо, во-первых, если у вас его еще нет, вам нужно создать класс контроллера для вашего приложения. Добавьте выход для 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];
}

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

1 голос
/ 08 октября 2014

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

-(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];

т.е.

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

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

0 голосов
/ 04 января 2019

Просто создайте отдельный @IBAction в вашем контроллере и вызовите метод NSArrayController.add вручную. После этого вы можете выбрать строку

@IBAction func addLink(_ sender: Any) {
    // Get the current row count from your data source
    let row = links.count

    arrayController.add(sender)

    DispatchQueue.main.async {
        self.tableView.editColumn(0, row: row, with: nil, select: true)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...