【Xcode】UITableViewを追加しただけで落ちる
勉強のため、買い物計画アプリを作ることにしました。
よくある買い物リスト+地図上に買い物ルートを表示できる、という
旅行先など遠出の買い物で効率よく買い物するのに便利かもしれないアプリです。
普段仕事では使わないStoryboard、ARC、AutoLayoutなどの機能も
折角なので使ってみたいと思います。
が、早速つまづいたので忘れないようにメモ。
UITableViewを追加しただけで落ちる
Xcode5にて「Single View Application」の新規プロジェクトを作成します。
Main.storyboardで最初から追加されているViewControllerにUITableViewを置きます。
ViewController.hにUITableViewDataSource、UITableViewDelegateを追加し、
Main.storyboardでUITableViewと結びつけます。
@interface ViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
@end
UITableViewDataSource、UITableViewDelegateのメソッドをViewController.mに追加します。
私はUITableViewControllerのサブクラスを新規追加して、その.mファイルの
「#pragma mark - Table view data source」から「#pragma mark - Navigation」の前までを
ViewController.mにコピペしました。
TableViewのセクション数、行数はとりあえず1にします。
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
return 1;
}
これでとりあえず真っ白なTableViewが表示されるはず、と思い実行すると…
「SIGABRT」と出て落ちました。
解決方法
落ちる原因は、下記で使われている
「[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]」
のようです。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
// Configure the cell...
return cell;
}
これを使うためには 事前にセルのIdentifierを登録しておく必要があるそうです。
ということで、viewDidLoadあたりに下記を追加します。
(self.tableViewはTableViewのアウトレット)
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
UITableViewControllerにはないし、何が悪いかしばらく気づきませんでした。
iOS6以降の変更点だそうです。