勉強のため、買い物計画アプリを作ることにしました。

よくある買い物リスト+地図上に買い物ルートを表示できる、という

旅行先など遠出の買い物で効率よく買い物するのに便利かもしれないアプリです。

 

普段仕事では使わないStoryboard、ARC、AutoLayoutなどの機能も

折角なので使ってみたいと思います。

 

が、早速つまづいたので忘れないようにメモ。

 

UITableViewを追加しただけで落ちる

 Xcode5にて「Single View Application」の新規プロジェクトを作成します。

f:id:an3714106:20131117171330p:plain

 

Main.storyboardで最初から追加されているViewControllerにUITableViewを置きます。

f:id:an3714106:20131117171348p:plain

 

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」と出て落ちました。

f:id:an3714106:20131117175834p:plain

 

解決方法

落ちる原因は、下記で使われている

「[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以降の変更点だそうです。