2014.10.9

【Objective-C】UITableViewのセル数を1以上にすると落ちてしまうときの対処法

インターンOB インターン

久保田 凌介


Photo 10-8-14, 18 59 15

こんばんんは、エンジニアインターンのくぼたんです。

現在未来電子のiOSアプリ開発中なんですが、

あるエラーでハマりにハマったのでメモしときます!

テーブルのセル数を1以上にすると落ちるエラーの対処法

僕がやりたかったことは、UITableViewのセルを、下までスクロールする度に増やす。

これをやりたくて

まずは初期に表示されるセルの数を指定しようとnumberOfRowsInSectionメソッドのリターンの数値を変えてみたんですが、

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 5;
}

スクリーンショット 2014-10-07 15.28.05
ファッ!?

途中で落ちちゃいました…

しかもこの「Thread 1:signal SIGABRT」っていうエラー

エラーが出てますよって言ってるだけで、原因がハッキリわからないんですよね。

たぶんXcodeで開発してる方は、嫌になるほどこのエラーを見てるかと思います。笑

でもリターンの値を0にすると落ちないんだよねー

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 0; 
}

↑落ちない

なんでリターンを0とかnilにすると落ちないのに、1以上の数字入れると落ちるの?

と思って検索してみたんですが…出てこない!?

なので、僕の得意技の一つであるブレークポイントの大量設置を発動して

プログラムの流れを一つ一つ見ていきました。笑

スクリーンショット 2014-10-08 18.24.35

とりあえず流れが見れればいいので設置場所はてきとーですw

そしてついに発見しました!!

なぜかnumberOfRowsInSectionメソッドを2回通っていて

なんだこれ?

と思っていろいろ考えてみた結果

自分なりの解釈ですが、

セクション毎に1つ空のセルを作ってるんだ!(間違ってたらすいません)

と勝手に解釈して、それならばとこのようにリターンを条件分岐させてみました。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    if([self.items count] == 0){
        return 0;
    }else{
        return 5;
    }   
}

実行すると落ちない!!

わーい!

最後に

やっと一つ解決しましたが、

次は

・scrollViewDidScrollが呼ばれねぇ

・全記事取ってきたいのに一部しか取ってこれない

開発してると、どんどんエラーが出てきますね…

今までは、こんなことやりたいなぁっていうことや

エラーの対処法など調べればすぐに出てきたんですが

最近はなかなか出てこないT_T

まぁこれも自分の技術力とかが上がったんだと勝手に思っておきます。

ではまた


この記事を書いた人

インターンOBインターン

久保田 凌介