我正在使用Core Data编写一个应用程序来控制一些NSTableViews。我有一个添加按钮,在NSTableView中创建一个新的记录。单击此按钮时,如何将焦点移动到新记录,以便我可以立即键入其名称?在iTunes中也是如此,在点击添加播放列表按钮后,键盘焦点会立即移动到新行,以便您键入播放列表的名称。
答案 0 :(得分:18)
好的,首先,如果你还没有,你需要为你的应用程序创建一个控制器类。在控制器类的界面中添加存储对象的NSArrayController
的插座,以及显示对象的NSTableView
的插座。
IBOutlet NSArrayController *arrayController;
IBOutlet NSTableView *tableView;
将这些出口连接到IB中的NSArrayController
和NSTableView
。然后,您需要创建一个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 :(得分:1)
我相信更简单,更恰当的方法是通过这种方式实现它。
-(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
。重要提示:当用户只选择一行时,此解决方案也会触发编辑。如果您只想在添加新对象时触发编辑,则不适合您。
答案 2 :(得分:0)
只需在控制器中创建一个单独的@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)
}
}