24/7 twenty-four seven

iOS/OS X application programing topics.

UITableViewでページング処理をする。

App Storeとかであるんだけど、UITableViewの最初の20件とかを
読み込んでおいて、もっと見たい場合は一番下のセルの
「ほかの??件を読み込む」
とか
「次の??件…」
ってのを押すとインジケーターがぐるぐる回って
そこにセルがインサートされるみたいなやつを作りたくて
検索してみたけど実装する方法がみつからない。
あれってどうやればいいんだろう…。
もうちょっと探してみる。

UITableViewで「ほかの??件を読み込む」を実装する方法がわからない - clouderのiPhoneアプリを公開するまでの日記 - iPhoneアプリ開発グループ


「次の??件…」を表示するために最初のデータ件数+1をテーブルビューの行数とします。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSInteger count = [myBookmarks count];
    if (count == 0) {
        return 0;
    } else if (count == FEED_OFFSET) {
        return count + 1;
    } else {
        return count;
    }
}


一番下のセルが「次の??件…」のセルなので、一番下のセルだけ別処理にして「次の??件…」を表示します。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {	
    if (indexPath.row == [myBookmarks count]) {
        // 「次の??件…」のセルの処理
        MyBookmarkNextCell *cell = (MyBookmarkNextCell *)[tableView dequeueReusableCellWithIdentifier:@"MyBookmarkNextCell"];
        if (cell == nil) {
            MyBookmarkNextCellController *controller = [[MyBookmarkNextCellController alloc] initWithNibName:@"MyBookmarkNextCell" bundle:nil];
            cell = (MyBookmarkNextCell *)controller.view;
            [controller release];
        }

        return cell;
    } else {
        // 通常のセルの処理
        MyBookmarkCell *cell = (MyBookmarkCell *)[tableView dequeueReusableCellWithIdentifier:@"MyBookmarkCell"];
        if (cell == nil) {
            cell = [[[MyBookmarkCell alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 70.0f) reuseIdentifier:@"MyBookmarkCell"] autorelease];
        }
		
        NSDictionary *entry = [myBookmarks objectAtIndex:indexPath.row];
        [cell.titleLabel setText:[entry objectForKey:@"title"]];
        [cell.linkLabel setText:[entry objectForKey:@"related"]];

        return cell;
    }
}


「次の??件…」のセルが選択されたときは、続きのデータを読み込む処理をします。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row == FEED_OFFSET) {
    // 「次の??件…」が選択されたとき
        [self loadNext];
        [tableView deselectRowAtIndexPath:indexPath animated:YES];
    } else {
        // 通常のセルが選択されたとき
        selectedRow = indexPath;
        WebViewController *controller = [[HatenaTouchAppDelegate sharedHatenaTouchApp] sharedWebViewController];
        NSDictionary *entry = [myBookmarks objectAtIndex:indexPath.row];
		
        controller.title = [entry objectForKey:@"title"];
        controller.pageURL = [entry objectForKey:@"related"];
        [[self navigationController] pushViewController:controller animated:YES];
    }
}


続きのデータを読み込んだ後に、テーブルビューの表示をreloadDataメソッドで更新します。

- (void)loadNext {
    offset += FEED_OFFSET;
    [self loadMyBookmarks];
    [self.tableView reloadData];
}

関連リンク