在 NSTableView 单元格编辑上更新数据源

Updating datasource on NSTableView cell edit

我已经为此苦苦挣扎了三天。我已经在此处和 Google 上查找了我能找到的所有内容,所以请理解我是在已经精疲力竭地试图找到答案之后才问这个问题的。我也是 Cocoa 的新手,所以如果这看起来微不足道,我深表歉意,但对我来说不是。我在学! :)

我正在使用简单的字符串值填充 NSTableView。这就是我所需要的。我还需要这些值可以内联编辑。到目前为止一切顺利,我已经完成了所有这些工作。

问题是我不知道如何将这些更改保存到我的数据源。我已经尝试了所有建议的委托方法,但它们要么没有被调用,要么我不知道如何获取更新后的值以分配给我的 NSMutableArray。

代码如下:

//
//  AppDelegate.m
//  TableView
//

//  Created by Jay Moser on 2016-03-07.
//  Copyright © 2016 Jay Moser. All rights reserved.
//

#import "AppDelegate.h"

@interface AppDelegate ()

@property (weak) IBOutlet NSWindow *window;
@end

@implementation AppDelegate
{
    NSMutableArray* _tableContents;
    IBOutlet NSTableView* _tableView;
}

- (IBAction)Add:(id)sender
{
    [_tableView reloadData];
}

- (void)applicationDidFinishLaunching:(NSNotification *)notification
{
    _tableContents = [[NSMutableArray alloc] init];

    [_tableContents addObject:@"Item 1"];
    [_tableContents addObject:@"Item 2"];
    [_tableContents addObject:@"Item 3"];
    [_tableContents addObject:@"Item 4"];
    [_tableContents addObject:@"Item 5"];
    [_tableContents addObject:@"Item 6"];
    [_tableContents addObject:@"Item 7"];
    [_tableContents addObject:@"Item 8"];

    [_tableView reloadData];
}

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView
{
    return [_tableContents count];
}

- (NSView*)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
    NSTableCellView* cellView = [_tableView makeViewWithIdentifier:@"name" owner:self];
    cellView.textField.stringValue = _tableContents[row];

    return cellView;
}

// ====================================================================================
//
//  If I run the application, double click an item in the tableview and, for example,
//  rename "Item 4" to "Renamed Item" ... I need a method here to detect that the change
//  happened and changes "Item 4" in _tableContents to "Renamed Item"
//
//
// ====================================================================================

@end

您需要为文本字段指定目标和操作,这将在您的单元格完成编辑时调用:

- (NSView*)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
    NSTableCellView* cellView = [_tableView makeViewWithIdentifier:@"name" owner:self];
    cellView.textField.stringValue = _tableContents[row];
    [cellView.textField setTarget:self];
    [cellView.textField setAction:@selector(onEditRow:)];
    return cellView;
}

- (IBAction)onEditRow:(id)sender
{
    NSInteger row = [_tableView rowForView:sender];
    if (row != -1) {
        _tableContents[row] = [sender stringValue];
    }
}

请参阅 了解使用界面生成器设置操作的替代方法。