使用从textFields创建的对象填充NSTableView
这是我在这里的第一个问题。如果以前有人问过,我很抱歉,但在搜索时找不到任何东西。另外,我对编程相当陌生,所以请耐心等待。使用从textFields创建的对象填充NSTableView
基本上我想填充我NSTableView的与通过填写文本框,然后点击一个按钮,创建从自定义类的对象。
这是页面,用户将填写他们正在创建的对象的信息: ]
当点击完成按钮,它会带您到包含表图,其中新此页对象,你刚刚创建应补充:
这是我的我的头文件:
#import <Cocoa/Cocoa.h>
@interface AppDelegate : NSObject <NSApplicationDelegate, NSTableViewDataSource>{
NSArray *_tradeArray;
NSMutableDictionary *_tradeDictionary;}
@property (weak) IBOutlet NSTabView *myTabView;
@property (weak) IBOutlet NSTextField *titleTextField;
@property (weak) IBOutlet NSTextField *volumeTextField;
@property (weak) IBOutlet NSTextField *publisherTextField;
@property (weak) IBOutlet NSTextField *upcTextField;
@property (weak) IBOutlet NSTableView *myTableView;
- (IBAction)tradeLibraryButton:(id)sender;
- (IBAction)backtoMainButton:(id)sender;
- (IBAction)addTradePage:(id)sender;
- (IBAction)cancelAddTrade:(id)sender;
- (IBAction)FinishAddingTrade:(id)sender;
@end
这是我实现文件:
#import "AppDelegate.h"
#import "JMTradePaperback.h"
@interface AppDelegate()
@property (weak) IBOutlet NSWindow *window;
@end
@implementation AppDelegate
-(id)init{
self = [super init];
if (self){
_tradeDictionary = [[NSMutableDictionary alloc]init];
_tradeArray = [_tradeDictionary allKeys];
}
return self;}
- (IBAction)tradeLibraryButton:(id)sender {
[_myTabView selectTabViewItemAtIndex:1];}
- (IBAction)backtoMainButton:(id)sender {
[_myTabView selectTabViewItemAtIndex:0];}
- (IBAction)addTradePage:(id)sender {
[_myTabView selectTabViewItemAtIndex:2];}
- (IBAction)cancelAddTrade:(id)sender {
[_myTabView selectTabViewItemAtIndex:1];}
- (IBAction)FinishAddingTrade:(id)sender {
JMTradePaperback *aTrade = [[JMTradePaperback alloc]init];
[aTrade setTitle:[_titleTextField stringValue]];
[aTrade setVolume:[_volumeTextField stringValue]];
[aTrade setPublisher:[_publisherTextField stringValue]];
[aTrade setUpcCode:[_upcTextField stringValue]];
[_tradeDictionary setObject:aTrade forKey:[NSString stringWithFormat:@"%@", _upcTextField.stringValue]];
[_myTabView selectTabViewItemAtIndex:1];
[_myTableView reloadData];}
-(NSInteger)numberOfRowsInTableView:(NSTableView *)tableView{
return _tradeArray.count;}
-(id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row{
if ([tableColumn.identifier isEqualToString:@"Title"]){
JMTradePaperback *item = [_tradeArray objectAtIndex: row];
return item.title;}
if ([tableColumn.identifier isEqualToString:@"Volume"]){
JMTradePaperback *item = [_tradeArray objectAtIndex:row];
return item.volume;}
else{
JMTradePaperback *item = [_tradeArray objectAtIndex:row];
return item.publisher;}
}
@end
而且这里的tableView的图片迷上了AppDelegate中作为数据源,并且画面显示,我设置的列标识符: Datasource, Column Identifier
不知道我在做什么错在这里,但任何帮助真的很感激。 谢谢。
您需要更新每次修改词典时_tradeArray
。由于您的代码目前有效,因此_tradeArray
包含字典的键,就像它初始化时一样,并且在该点之后永远不会更改。
你应该声明_tradeArray
作为可变数组(NSMutableArray*
)。您可以将其初始化为[[NSMutableArray alloc] init]
,或者,如果您愿意,可以[[_tradeDictionary allKeys] mutableCopy]
。您可以在添加到字典的同一点(假设UPC是新的并且不在字典中)的情况下将每个键(UPC)追加到它。
在init方法中,我将'_tradeArray'更改为可变数组,并将其更改为'_tradeArray = [[NSMutableArray alloc] init];''。我在'FinishAddingTrade'方法中尝试了'_tradeArray = [[_tradeDictionary allKeys] mutableCopy];'但没有运气。我也试过:'[_tradeArray addObject:[_ tradeDictionary objectForKey:[NSString stringWithFormat:@“%@”,_upcTextField.stringValue]]];'但这也没有效果。 – JackLikesPizza
前提是你必须正确地添加表列标识符,下面应该工作,我想。
// AppDelegate.h
@interface AppDelegate : NSObject <NSApplicationDelegate, NSTableViewDataSource>
@property (weak) IBOutlet NSTabView *myTabView;
@property (weak) IBOutlet NSTextField *titleTextField;
@property (weak) IBOutlet NSTextField *volumeTextField;
@property (weak) IBOutlet NSTextField *publisherTextField;
@property (weak) IBOutlet NSTextField *upcTextField;
@property (weak) IBOutlet NSTableView *myTableView;
...
// AppDelegate.m
@implementation AppDelegate {
NSArray *tradeArray;
}
@synthesize myTabView,titleTextField,volumeTextField,publisherTextField,upcTextField,myTableView;
- (void)applicationWillFinishLaunching:(NSNotification *)notification {
tradeArray = [[NSMutableArray alloc] init];
}
- (IBAction)FinishAddingTrade:(id)sender {
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:titleTextField.stringValue,@"title",volumeTextField.stringValue,@"volume",publisherTextField.stringValue,@"publisher",nil];
[tradeArray addObject:dict];
[myTableView reloadData];
}
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
return tradeArray.count;
}
-(id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
NSString *title = [[tradeArray objectAtIndex:rowIndex] objectForKey:@"title"];
NSString *vol = [[tradeArray objectAtIndex:rowIndex] objectForKey:@"volume"];
NSString *pub = [[tradeArray objectAtIndex:rowIndex] objectForKey:@"publisher"];
if ([tableColumn.identifier isEqualToString:@"Title"]) {
return ;
}
if ([tableColumn.identifier isEqualToString:@"Volume"]){
return vol;
}
else{
return pub;
}
}
有了这个我得到'fileArray'的未声明的标识符错误。 “myTableView”中的列标识符与此代码中的标识符相匹配,并且appDelegate类正确连接为“myTableView”的数据源。 – JackLikesPizza
我犯了愚蠢的错误。我对最后一个tableView方法进行了更改。 –
因此,我修复了第二个表视图方法以反映上面的内容。我不得不将方法名称中的最后一个'row'更改为'rowIndex'。现在,一切都成功,但我仍然没有得到任何东西在我的tableView。我在原始问题中添加了两张图片,分别显示了如何挂钩我的tableView数据源,显示我设置了列标识符的图片。 – JackLikesPizza
您不会将您创建的字典添加到_tradeArray。还有更多的问题。 –
我应该如何将字典添加到'_tradeArray'?我尝试了几种不同的方式,但无法实现。另外,你还看到了什么其他问题? – JackLikesPizza
如果有机会,我可以通过使用可可绑定来帮助您使用非常少的代码完成上述操作。 –