使用按钮创建自定义 class 实例并将其显示在 NSTableView 中

Using a button to create a custom class instance and show it in an NSTableView

我一直卡在这个问题上,快把我逼疯了。我想要做的是单击按钮创建自定义 class 的实例,设置它的变量,将其添加到 NSMutableArray,并在 table 视图中显示它。到目前为止,除了在 table 视图中显示信息外,我似乎一切正常。

我的自定义 class TradePaperback 只有三个 NSString 属性:titlevolumepublisher

这是我的 header 和实现文件的代码:

Header:

#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject <NSApplicationDelegate>

@property (nonatomic, strong) NSMutableArray *tradeArray;

@property (weak) IBOutlet NSTableView *tableView;

- (IBAction)addTrade:(id)sender;


@end

实现文件:

#import "AppDelegate.h"
#import "tradePaperback.h"

@interface AppDelegate ()

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

@implementation AppDelegate

-(NSMutableArray *)tradeArray{
    if (!_tradeArray){
        _tradeArray = [[NSMutableArray alloc]init];
        TradePaperback *avengers = [[TradePaperback alloc]init];
    avengers.title = @"Avengers";
    avengers.volume= @"volume 01";
    avengers.publisher = @"Marvel Comics";
        [_tradeArray addObject:avengers];}
    return _tradeArray;}

- (IBAction)addTrade:(id)sender {
    TradePaperback *newTrade = [[TradePaperback alloc]init];
    newTrade.title = @"New Trade";
    newTrade.volume = @"Volume Number";
    newTrade.publisher = @"publisher";
    [_tradeArray addObject:newTrade];
    NSLog(@"added");
    NSLog(@"number of items in array is %ld", _tradeArray.count);
    [_tableView reloadData];}

@end

我的 table 视图是使用绑定连接的。似乎一切都正确连接,因为当我 运行 程序时,我输入的 TadePaperbackavengers 实例出现了。当我单击添加按钮时,我可以从控制台的日志中看到数组正在添加项目,但它们不会显示。

为什么 tableView 会显示数组中的第一项,而 none 显示其余项?

这是 运行 并单击添加按钮几次后的程序图片。

program running

非常感谢你们提供的任何帮助或建议。提前致谢。

-杰克

如果您使用绑定来填充 table 视图,您几乎可以肯定使用 NSArrayController 来管理 table 的内容。如果你想添加一个对象到这个控制器控制的数组(你的 tradeArray 对象),你应该间接地这样做:添加到数组控制器,它会依次更新你的数组。 NSArrayController 提供了许多 add...insert.. 方法;决定哪一个最适合您,并用它来代替您对 [_tradeArray addObject:...].

的呼叫

此方法有效而您的方法无效的原因是它涉及支持绑定的键值 coding/observing 机制。您的方法实质上是将对象 添加到数组控制器的背后 - 它不是 KVO/KVC-compliant,因此数组控制器仍然不知道更改。 Cocoa 是否为您提供了一种以 KVO/KVC-friendly 方式编辑原始数组的方法,如果您愿意的话,这只是多一点工作:尝试下面的代码,然后阅读 Apple 的 NSKeyValueCoding Protocol Reference and their Key-Value Coding Programming Guide 以获得解释:

// Instead of [_tradeArray addObject:newTrade];
[[self mutableArrayValueForKey:@"_tradeArray"] addObject:newTrade];