0

現在 45 個の項目を含む配列からデータを取り込んでいるテーブル ビューがあります。目標は、最初に 20 個を表示し、ユーザーがテーブル ビューの一番下までスクロールしたときにさらに 20 個のアイテムを段階的に表示することです。

セルに情報を入力するメソッドを次に示します。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
    if(!cell){
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cell"];
    }

    cell.textLabel.text = [[listings objectAtIndex:indexPath.row] objectForKey:@"listingName"];

    return cell;
}

テーブルビューの長さを決定する方法は次のとおりです。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    if (listings.count < 20){
        return listings.count;
    }
    return tableViewSize; 
}

tableViewSizeは、値 20 でインスタンス化するインスタンス変数です。次のメソッドを使用して、ユーザーが一番下までスクロールするたびに値を 20 ずつ増やします。

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
    if(indexPath.row == (listings.count - 1)){
        tableViewSize += 20;
        if(tableViewSize > listings.count){
            tableViewSize = listings.count; 
        }
    }
    [tableView reloadData];
}

問題は非常に奇妙です。後者のメソッドを含めるtableView:willDisplayCell:forRowAtIndexPath:と、テーブル ビューには 1 つのセルしか表示されません (現時点ではすべてのオブジェクトが同じであるため、配列内のどのオブジェクトかわかりません。必要に応じて調べることができます)。後者の方法をコメントアウトすると、テーブル ビューに 20 個のセルが正しく表示されます。

このメソッドがテーブルビューをこのように動作させる理由を誰かが知っていますか?

4

2 に答える 2

0

私が考えているのは、ロジックの一部が正しくないため、テーブルビューが常にリロードされていることです。willDisplayCell を次のように変更して、問題が解決するかどうかを確認します。

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
    if(indexPath.row == (tableViewSize - 1) && listings.count > tableViewSize) {
        tableViewSize += 20;
        if(tableViewSize > listings.count){
            tableViewSize = listings.count; 
        }
        [tableView reloadData];
    }
}
于 2013-07-29T16:52:24.530 に答える
0

あなたは自分自身を無限ループにしました。

セルが表示されるたびに を呼び出しますreloadData。tableView が再ロードされるたびreloadDataに、すべてのセルが再び表示されます。これは再び reloadData を呼び出します。その後、最初のセルが再び表示されます。等々。

reloadData への呼び出しを、tableView 内のアイテムの数を増やす場合に配置してみてください。

このような:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
    if(indexPath.row == (listings.count - 1)){
        tableViewSize += 20;
        if(tableViewSize > listings.count){
            tableViewSize = listings.count; 
        }
        [tableView reloadData];
    }
}

ユーザー エクスペリエンスを向上させるために、別の方法で新しいセルをリロードします。現在、最後のセルに到達するとスクロールが停止します。そのため、ユーザーは項目 100 を表示するために数回スクロールする必要があります。スクロールの勢いを維持できるため、次のような方法の方が適切に機能する可能性があります。

// viewDidLoad
displayedCount = 20;
realCount = 200;   // according to your backing array



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


- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView.contentOffset.y + scrollView.bounds.size.height > scrollView.contentSize.height * 0.75) {
        // reload when the user scrolled to 75% of the current cells. This way you can keep the momentum of the scroll and the table does not stop. 
        displayedCount += 20;
        if (displayedCount > realCount) {
            displayedCount = realCount;
        }
        [self.tableView reloadData];
    }
}
于 2013-07-29T16:46:17.560 に答える