2015-04-01 36 views
-1

我目前正在開發熟悉obj-c,我想填充TableView。花了幾個小時閱讀太多的博客文章後,我無法理解如何在我的TableView中添加一行。在OSX應用程序中按下按鈕時填充NSMutableArray中的NSTableView

這是我做了以下this guide

我在ViewControllerNSMutableArray,這ViewController實現這兩個接口NSTableViewDataSourceNSTableViewDelegate。我按照指南中的說明執行這兩種方法。我也有一個按鈕和一個tableView。當我點擊按鈕時,我用自己的對象填充陣列,這很好。

但我現在想要的是,當我的數組被填充,我的tableview也是。我知道我需要以某種方式綁定這兩個,但我不知道如何,有人可以給一些指示?

這是我爲我的ViewController代碼:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.tableViewEpisodes.delegate = self; 
    self.tableViewEpisodes.dataSource = self; 
} 

- (IBAction)btRefresh:(id)sender { 

    CalendarReader* reader = [[CalendarReader alloc]init]; 
    self.episodes = [Episode getEpisodeFromEKEvents:[reader getLastMonthEventsForCalendarName:@"TV Shows"]]; 
    [self.tableViewEpisodes reloadData]; 
} 

- (NSInteger)numberOfSectionsInTableView:(NSTableView *)tableView 
{ 
    return [self.episodes count]; 
} 

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColum row:(NSInteger)row { 

    // Retrieve to get the @"MyView" from the pool or, 
    // if no version is available in the pool, load the Interface Builder version 
    NSTableCellView *result = [tableView makeViewWithIdentifier:@"MyView" owner:self]; 

    // Set the stringValue of the cell's text field to the nameArray value at row 
    result.textField.stringValue = [self.episodes objectAtIndex:row]; 

    // Return the result 
    return result; 
} 

回答

0

感謝@布賴恩輪車,我注意到一個消息日誌測試自己的代碼時,我發現了,我是不是貫徹正確的方法:這裏是我現在對我的ViewController代碼:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.tableViewEpisodes.delegate = self; 
    self.tableViewEpisodes.dataSource = self; 
} 

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView 
{ 
    return 1; 
} 

-(id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex{ 
    return [self.episodes objectAtIndex:rowIndex]; 
} 

對於像我這樣的初學者,您還必須爲存儲在數據源數組中的類實施NSCopying協議。

現在,我只有一個元素在我的TableView中,它只顯示它的內存地址,但我會盡快更新這個答案,一旦我發現如何使它適用於未來的初學者在我的情況。

編輯:好的,它的工作原理!我的錯誤是:在tableView:objectValueForTableColumn:row:方法中,雖然我需要返回表示參數中給出的行的Object,但是我必須返回參數中給出的單元格AND,現在我發現它很明顯,但作爲法國人,我沒有正確理解方法名稱。這裏是我的代碼現在:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.tableViewEpisodes.delegate = self; 
    self.tableViewEpisodes.dataSource = self; 
} 

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView 
{ 
    return [self.episodes count]; 
} 

-(id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex{ 
    if([[aTableColumn title] isEqual: @"Serie's name"]){ 
     return [[self.episodes objectAtIndex:rowIndex] seriesName]; 
    }else if([[aTableColumn title] isEqual: @"Season number"]){ 
     return [NSString stringWithFormat:@"%ld", (long)[[self.episodes objectAtIndex:rowIndex] seasonNumber]]; 
    }else if([[aTableColumn title] isEqual: @"Episode number"]){ 
     return [NSString stringWithFormat:@"%ld", (long)[[self.episodes objectAtIndex:rowIndex]episodeNumber]]; 
    }else{ 
     return nil; 
    } 
} 

確實有一些優化,隨意建議。但它正在完成這項工作。

0

首先,要創建與您還沒有聲明的標識符的小區視圖,你需要做這樣的事情(假設你正確地通過了的UITableView協議在你的班級):

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *Ident = @"Ident"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Ident]; 
    if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:Ident] autorelease]; 
    } 

    [cell.textLabel setText: [yourArray objectAtIndex:indexPath.row]; 
    return cell; 
} 

這是您的NSTableView的委託方法。它在視圖加載時調用,因此您需要在運行時提供數據源。

其次,我假設你想要一行的行數等於你的數據數組。如果是這樣的話,你需要改變的委託方法:

- (NSInteger)numberOfSectionsInTableView:(NSTableView *)tableView 

到:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 

最後,請記住上述這些方法填充行,而不是列,你現在擁有它。一旦您填充陣列,您需要調用該方法:

[yourTableView reloadData] 

爲了刷新表格。

希望這會有所幫助。

+0

您好布萊恩,我正在開發一個應用程序的OSX,而​​不是iOS,所以它不是'UITableView',而是'NSTableView'(如果我是正確的,我可能在這裏犯了一個大錯誤:))但通過測試這段代碼,我注意到一條日誌消息,告訴corrct實現兩個方法,現在,我得到的錯誤是因爲我沒有在我的自定義類中實現NSCopying。 – 2015-04-01 22:08:46

+0

您有三種NSTableViewDataSource協議所需的方法。請參閱[this](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Protocols/NSTableDataSource_Protocol/index.html#//apple_ref/occ/intf/NSTableViewDataSource) – 2015-04-01 22:35:39

+0

但第三個只有當用戶可以編輯TableView中的數據時,這不是我的情況。 – 2015-04-01 22:42:18

相關問題