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

时间:2016-03-08 16:00:47

标签: macos cocoa delegates datasource nstableview

我已经三天苦苦挣扎了。我已经查到了我在这里和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

1 个答案:

答案 0 :(得分:1)

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

- (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];
    }
}

有关使用界面构建器设置操作的替代方法,请参阅this answer