Я пишу приложение с использованием Core Data для управления несколькими NSTableViews. У меня есть кнопка добавления, которая создает новую запись в NSTableView. Как сделать фокус перемещаться в новую запись, когда эта кнопка нажата, чтобы я мог сразу ввести имя? Это та же идея в iTunes, где сразу после нажатия кнопки добавления плейлиста фокус клавиатуры перемещается в новую строку, поэтому вы можете ввести имя плейлиста.
Перенести фокус на вновь добавленную запись в NSTableView
Ответ 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
оттуда с индексом строки.
Важное примечание: это решение также инициирует редактирование, когда пользователь просто выберет строку. Если вы хотите, чтобы редактирование запускалось при добавлении нового объекта, это не для вас.