macos - 更新 NSTableView 单元格编辑上的数据源

标签 macos cocoa delegates datasource nstableview

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

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

问题是我不知道如何将这些更改保存到我的数据源中。我已经尝试了所有建议的委托(delegate)方法,但它们要么没有被调用,要么我无法弄清楚如何获取更新的值以分配给我的 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];
    }
}

参见this answer关于使用界面生成器设置操作的替代方法。

关于macos - 更新 NSTableView 单元格编辑上的数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35872101/

相关文章:

ios - 无法通过当前模态转换将图像传递给另一个 UIViewController

macos - Golang下载和 '$GOPATH not set'

ruby - 找不到 bundle 命令 mac

cocoa - NSRuleEditor : Criteria for new row

swift - OS X 中 iOS 的 UIImagePNGRepresentation() 的等效项是什么?

objective-c - 从 Today 扩展应用程序发送系统事件

cocoa - clickedRow (NSTableView) 的子类

c# - 为什么在 C# 中不允许将此命名函数作为 Func<> 参数传递?

C# 事件 : How to process event in a parallel manner

iphone - 为什么委托(delegate)声明前面没有*?