13

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

4

3 回答 3

19

好的,首先,如果您还没有,您需要为您的应用程序创建一个控制器类。在控制器类的接口中为您NSArrayController的对象存储在其中添加一个出口,并为显示您的对象添加一个出口。NSTableView

IBOutlet NSArrayController *arrayController;
IBOutlet NSTableView *tableView;

将这些插座连接到IBNSArrayControllerNSTableViewIB。然后您需要创建一个IBAction在按下“添加”按钮时调用的方法;调用它addButtonPressed:或类似的东西,在你的控制器类接口中声明它:

- (IBAction)addButtonPressed:(id)sender;

并使其成为 IB 中“添加”按钮的目标。

现在你需要在你的控制器类的实现中实现这个动作;此代码假定您添加到数组控制器的对象是NSStrings;如果不是,则将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];
}

当您单击“添加”按钮时,这将被调用,并且将开始编辑新行第一列中的单元格。

于 2009-05-10T10:08:33.480 回答
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];

IE

  1. 实施tableViewSelectionDidChange:(NSNotification *)notification
  2. 获取选定的行索引
  3. editColumn:(NSInteger)column row:(NSInteger)row withEvent:(NSEvent *)theEvent select:(BOOL)select使用行索引从那里调用。

重要提示:当用户只需选择一行时,此解决方案还将触发编辑。如果您只想在添加新对象时触发编辑,那么这不适合您。

于 2014-10-08T17:40:29.810 回答
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)
    }
}
于 2019-01-04T20:07:26.477 回答