使用按钮创建自定义 class 实例并将其显示在 NSTableView 中
Using a button to create a custom class instance and show it in an NSTableView
我一直卡在这个问题上,快把我逼疯了。我想要做的是单击按钮创建自定义 class 的实例,设置它的变量,将其添加到 NSMutableArray
,并在 table 视图中显示它。到目前为止,除了在 table 视图中显示信息外,我似乎一切正常。
我的自定义 class TradePaperback
只有三个 NSString
属性:title
、volume
和 publisher
。
这是我的 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 视图是使用绑定连接的。似乎一切都正确连接,因为当我 运行 程序时,我输入的 TadePaperback
的 avengers
实例出现了。当我单击添加按钮时,我可以从控制台的日志中看到数组正在添加项目,但它们不会显示。
为什么 tableView 会显示数组中的第一项,而 none 显示其余项?
这是 运行 并单击添加按钮几次后的程序图片。
非常感谢你们提供的任何帮助或建议。提前致谢。
-杰克
如果您使用绑定来填充 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];
我一直卡在这个问题上,快把我逼疯了。我想要做的是单击按钮创建自定义 class 的实例,设置它的变量,将其添加到 NSMutableArray
,并在 table 视图中显示它。到目前为止,除了在 table 视图中显示信息外,我似乎一切正常。
我的自定义 class TradePaperback
只有三个 NSString
属性:title
、volume
和 publisher
。
这是我的 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 视图是使用绑定连接的。似乎一切都正确连接,因为当我 运行 程序时,我输入的 TadePaperback
的 avengers
实例出现了。当我单击添加按钮时,我可以从控制台的日志中看到数组正在添加项目,但它们不会显示。
为什么 tableView 会显示数组中的第一项,而 none 显示其余项?
这是 运行 并单击添加按钮几次后的程序图片。
非常感谢你们提供的任何帮助或建议。提前致谢。
-杰克
如果您使用绑定来填充 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];