2016-01-11 25 views
1

這是我在這裏的第一個問題。如果以前有人問過,我很抱歉,但在搜索時找不到任何東西。另外,我對編程相當陌生,所以請耐心等待。使用從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

如果有機會,我可以通過使用可可綁定來幫助您使用非常少的代碼完成上述操作。 –

回答

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

0

前提是你必須正確地添加表列標識符,下面應該工作,我想。

// 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