2012-02-02 78 views
4

我目前通過控制器(MVC設計模式)填充一個NSTableView,我在控制器的init方法中初始化一個NSMutableArray的條目。如何填充NSTableView?

我怎麼會:

  1. 填充我的NSMutableArray這是Person對象的數組
  2. 我應該填充的NSMutableArray在我的我的基類,而不是mainViewDidLoad方法?我還沒有找到任何示例或資源。

模型(Person.m)

#import "Person.h" 


@implementation Person 

@synthesize name; 
@synthesize gender; 

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     name = @"Bob"; 
     gender = @"Unknown"; 
    } 

    return self; 
} 

- (void)dealloc 
{ 
    self.name = nil; 
    self.gender = nil; 

    [super dealloc]; 
} 

@end 

控制器(PersonController.m)

#import "PersonController.h" 
#import "Person.h" 


@implementation PersonController 

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     PersonList = [[NSMutableArray alloc] init]; 
//  [personList addObject:[[Person alloc] init]]; 
//   
//  [personTable reloadData]; 
    } 

    return self; 
} 

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

- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { 
    Person *person = [personList objectAtIndex:row]; 
    NSString *identifier = [tableColumn identifier]; 

    return [person valueForKey:identifier]; 
} 

- (void)dealloc 
{ 
    [super dealloc]; 
} 

@end 

基礎文件(Main.h):

#import "Main.h" 

@implementation Main 

- (void)mainViewDidLoad 
{ 

} 

@end 

回答

3

我怎麼會:

  • 填充我的NSMutableArray這是Person對象的數組

第1步:創建Person對象。

第2步:Add them to the array.

你註釋掉的代碼正是這樣做的,但你或許應該在單獨的情況下創造的人,你想進行配置(例如,設置它的名稱)。

我應該在我的基類的mainViewDidLoad方法中填充NSMutableArray嗎?

它並不真正的問題提前多久用戶看到你的模型創建,但在概念上,它那種氣味給我。它與視圖沒有任何關係,所以我說它屬於init

當然,如果主視圖和其中的每個視圖都已經加載,您需要tell the table view to reload your data以顯示您對該數組所做的任何更改。相反,如果您在加載視圖之前創建模型,則最初不需要重新加載,因爲表格視圖已經向您請求您的模型一次。

1

不速之客,你在PersonController中註釋掉的代碼看起來是正確的。我假設NSTableRow具有正確的標識符。唯一的問題是你的人物對象是空白的,所以沒有字符串顯示。我敢打賭,發生的事情是,你的行在第一行試圖顯示nil,而不是顯示空字符串。創建你的person對象,設置名稱和性別字段,然後把它放到NSMutableArray中並調用reloadData工作(基本上,你的評論代碼是做什麼的,除非你現在提供了一些實際的數據來顯示)?

+0

對不起,我應該包括我的初始化器的代碼。爲了清楚起見,我使用Person.m替換Person.h來查看更新 – Coderama 2012-02-02 07:19:48

0

好吧,我假設你的控制器有一個IBOutlet NSTableView的*代碼PersonTable屬性,它在界面生成器的約束?

而且,在控制器的接口協議應該聲明,但同樣,由於控制器的實現具有適當的方法,我假設你有這個設置正確了。

另一個細節,已在表列標識被正確設置在界面生成器?從這個例子中,我不清楚列標識符如何與Person的屬性(名稱和性別)相關。數組personList不應該保存字典對象,其中字典的對象是人,字典的鍵映射到您在界面構建器中設置的列標識符?

另一個技術性,一個屬性的名稱(PersonList)不應該以大寫字母開頭。我想只是一個錯字,編譯器至少應該在您嘗試獲取personList時使用小寫字母p來抗議。