将焦点移动到NSTableView中新添加的记录

时间:2009-05-10 08:27:28

标签: objective-c cocoa macos nstableview

我正在使用Core Data编写一个应用程序来控制一些NSTableViews。我有一个添加按钮,在NSTableView中创建一个新的记录。单击此按钮时,如何将焦点移动到新记录,以便我可以立即键入其名称?在iTunes中也是如此,在点击添加播放列表按钮后,键盘焦点会立即移动到新行,以便您键入播放列表的名称。

3 个答案:

答案 0 :(得分:18)

好的,首先,如果你还没有,你需要为你的应用程序创建一个控制器类。在控制器类的界面中添加存储对象的NSArrayController的插座,以及显示对象的NSTableView的插座。

IBOutlet NSArrayController *arrayController;
IBOutlet NSTableView *tableView;

将这些出口连接到IB中的NSArrayControllerNSTableView。然后,您需要创建一个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];

即。

  1. 实施tableViewSelectionDidChange:(NSNotification *)notification
  2. 获取所选行索引
  3. 使用行索引从那里调用editColumn:(NSInteger)column row:(NSInteger)row withEvent:(NSEvent *)theEvent select:(BOOL)select
  4. 重要提示:当用户只选择一行时,此解决方案也会触发编辑。如果您只想在添加新对象时触发编辑,则不适合您。

答案 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)
    }
}