使用从textFields创建的对象填充NSTableView

问题描述:

这是我在这里的第一个问题。如果以前有人问过,我很抱歉,但在搜索时找不到任何东西。另外,我对编程相当陌生,所以请耐心等待。使用从textFields创建的对象填充NSTableView

基本上我想填充我NSTableView的与通过填写文本框,然后点击一个按钮,创建从自定义类的对象。

这是页面,用户将填写他们正在创建的对象的信息: Create object page]

当点击完成按钮,它会带您到包含表图,其中新此页对象,你刚刚创建应补充: Table View Page

这是我的我的头文件:

#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中作为数据源,并且画面显示,我设置的列标识符: DatasourceColumn Identifier

不知道我在做什么错在这里,但任何帮助真的很感激。 谢谢。

+0

您不会将您创建的字典添加到_tradeArray。还有更多的问题。 –

+0

我应该如何将字典添加到'_tradeArray'?我尝试了几种不同的方式,但无法实现。另外,你还看到了什么其他问题? – JackLikesPizza

+0

如果有机会,我可以通过使用可可绑定来帮助您使用非常少的代码完成上述操作。 –

您需要更新每次修改词典时_tradeArray。由于您的代码目前有效,因此_tradeArray包含字典的键,就像它初始化时一样,并且在该点之后永远不会更改。

你应该声明_tradeArray作为可变数组(NSMutableArray*)。您可以将其初始化为[[NSMutableArray alloc] init],或者,如果您愿意,可以[[_tradeDictionary allKeys] mutableCopy]。您可以在添加到字典的同一点(假设UPC是新的并且不在字典中)的情况下将每个键(UPC)追加到它。

+0

在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; 
    } 
} 
+0

有了这个我得到'fileArray'的未声明的标识符错误。 “myTableView”中的列标识符与此代码中的标识符相匹配,并且appDelegate类正确连接为“myTableView”的数据源。 – JackLikesPizza

+0

我犯了愚蠢的错误。我对最后一个tableView方法进行了更改。 –

+0

因此,我修复了第二个表视图方法以反映上面的内容。我不得不将方法名称中的最后一个'row'更改为'rowIndex'。现在,一切都成功,但我仍然没有得到任何东西在我的tableView。我在原始问题中添加了两张图片,分别显示了如何挂钩我的tableView数据源,显示我设置了列标识符的图片。 – JackLikesPizza