こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

Objective-C, Cocoaアプリ

こんにちわ。初歩的な質問ですが、Objective-C, Cocoa Application両方とも初心者です。ボボタンを押すことで、NSTableViewに新しいデータを追加したいのですが、
デバッグして、データ自体はちゃんとデータソースの方に追加されているのですが、TableViewが表示していないようです。
reloadData, setNeedsDisplayも両方ためしたのですが、表示されません。
ちなみに、新しいデータを追加する関数ですが、tableViewがロードされる前にコールしたときはちゃんと新しいデータがtableViewに表示されています。
コードです。
******************
dataはNSMutableArrayでItemInfoというクラスのArrayです。(ItemInfoは単純にNSString* nameとint priceの2つのデータを持っているクラスです。)
この関数はすべてNSViewControllerのメンバ関数です。
-------コード----------

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
if(self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]){
data = [[NSMutableArray alloc]initWithCapacity:5];
[data addObject:[[ItemInfo alloc]initWithName:@"Item1" price:100]];
[self addNewItem:nil]; //ここでのaddNewItemは反映され、TableViewには合計2つのデータが表示されています。
}
return self;
}
-(IBAction)addNewItem:(id)sender
{
//ここはボタンを押したときにちゃんと実行されているのを確認しています。
//実際にdataにも新しいデータが追加されていることをデバッガで確認済みです。
ItemInfo *newItem = [[ItemInfo alloc]initWithName:@"NewItem" price:300];
[data addObject: newItem];

[tableView reloadData];
}

#pragma mark -
#pragma mark Table View Datasource
- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView
{
return [data count];
}

- (id)tableView:(NSTableView *)aTableView
objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
{
//tableView には2つのColumnがあり、一つ目はItemInfo内のnameを、2つ目にはpriceを表示しています。
if([aTableColumn.identifier isEqual:@"Item"]){
return [[data objectAtIndex:rowIndex] name];
}else if([aTableColumn.identifier isEqual:@"Price"]){
return [NSString stringWithFormat:@"%d", [[data objectAtIndex:rowIndex] price]];
}
return nil;
}
------コード終わり------

開発環境は以下の通りです。
OS: MacOSX10.6 SnowLeopard
Xcode Version3.2.4
Cocoa Application

投稿日時 - 2010-11-14 07:59:05

QNo.6318145

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

例示のコードソースには、問題はないと見えます。

> //実際にdataにも新しいデータが追加されていることをデバッガで確認済みです。

(1) ItemInfoインスタンス「newItem」が、NSMutableArray「data」に追加されたことを確認した。
(2) ItemInfoインスタンス「newItem」に、「name = NewItem、price = 100」が保持(retain)されていることを確認した。
どちらでしょうか?本来なら、両方の確認でなければなりません。

例示のコードソースに問題がないのであれば、例示されていないクラス「ItemInfo」のコードソースを疑うことになります。
予測としてですが、ItemInfo内のデータ、nameとpriceが、autoreleaseされてしまっているのではないかと考えます。

※本題と関係ありませんが、かついちいち指摘せずとも、おわかりのこととは存じますが、ねんのため。

> - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

NSTableViewをInterface Builderで作成している場合、「- (void)awakeFromNib」でテーブルまわりを初期化(Initialize)したほうが、確実です。

> data = [[NSMutableArray alloc]initWithCapacity:5];

たんに「[[NSMutableArray alloc] init]」でかまいません。これで初期化すると、「@""」つまり空の文字列が作成されます。ガベージコレクションが有効なObjective-C 2.0なら、「[NSString string]」でも可。

> return [NSString stringWithFormat:@"%d", [[data objectAtIndex:rowIndex] price]];

NSTableViewは、セルに渡すオブジェクトとして、NSStringだけでなく、NSNumberも使えるので、「[NSNumber numberWithInt: [[data objectAtIndex:rowIndex] price]]」でも可です。

投稿日時 - 2010-11-14 16:57:32

あなたにオススメの質問