8

以下は、フィードのさまざまなページを取得して解析するために使用している関数です。

- (void)getFeed:(NSInteger) pageNumber
{
    collectedData = [[NSMutableData alloc] init];
    NSString *urlStr =[NSString stringWithFormat:@"http://sitename.com/feed/?paged=%d", pageNumber];
    NSURL *url = [NSURL URLWithString:urlStr];
    NSURLRequest *req = [NSURLRequest requestWithURL:url];
    conn = [[NSURLConnection alloc] initWithRequest:req delegate:self startImmediately:YES];
}

ユーザーがテーブルビューの一番下までスクロールすると、以下の関数を使用してフィードの 2 ページ目にアクセスし、カウンターをインクリメントします。

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    float endScrolling = scrollView.contentOffset.y + scrollView.frame.size.height;
    if (endScrolling >= scrollView.contentSize.height)
    {
        counter ++;
        [self getFeed:counter];
    }
}

問題は、既にフェッチされたアイテムの下にロードする代わりに、テーブルビューをリロードして新しいページアイテムを表示し、古いアイテムが消える場合です。既存のページアイテムの下に新しいページアイテムをロードして、無限にスクロールしたい。どうやってやるの?

4

7 に答える 7

2

あなた自身の質問に答えるのは気分が悪いですが、別のフォーラムの助けを借りて、答えを見つけることができました.

テーブルビューコントローラーは可変配列と同期していなかったため、別の配列を作成して両方の配列を追加しました。

Step1: プロパティを作成しました

@property (nonatomic, readonly) NSMutableArray *moreItems;

ステップ 2: fetchEntries を呼び出す前に、ViewDidLoad で配列を初期化しました

moreItems = [[NSMutableArray alloc] init];

Step3: connectionDidFinishLoading で、新しい配列 'moreItems' を前の配列 'items' に追加しました

[moreItems addObjectsFromArray:[channel items]];

Step4: numberOfRowsInSection のデータ ソースを

return [[channel items] count];

新しい配列へ

return [moreItems count];

そして cellForRowAtIndexPath で、新しい配列を使用しました

RSSItem *item = [moreItems objectAtIndex:[indexPath row]];
于 2012-12-30T05:48:05.180 に答える
1

次のページの新しいフィードの取得が完了したら、配列内のオブジェクトを取得します。これらのオブジェクトをこの配列からデータ ソース配列に追加します。次のようにテーブルに行を挿入します。

[yourTable beginUpdates];
[yourTable insertRowsAtIndexPaths:indexPathsToInsert
                 withRowAnimation:UITableViewRowAnimationBottom];
[yourTable endUpdates];

ここで、「indexPathsToInsert」は、テーブルの最後の行から始まる NSIndexPath オブジェクトの配列であり、新しいオブジェクトの indexPath が含まれています。

お役に立てれば。

于 2012-12-28T11:48:26.170 に答える
1

配列に新しいオブジェクトが追加されるたびに、これを呼び出します

-(void)insertRowInTableView
 {
   int row = [YourDataSourceArray count];
   NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:0];
   NSArray *indexPaths = [NSArray arrayWithObject:indexPath];
   [YourTableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationTop];
 }

ここでYourDataSourceArrayは、テーブルビューの行数/データを設定する配列です。 YourTableViewは、tableView オブジェクト名です。

于 2012-12-28T11:19:03.930 に答える
1

やあ、

開始インデックスが (データソース内のオブジェクトの数) で、追加するオブジェクトの数 (カウント) で for ループを作成し、インデックスパスの配列を作成して、insertRowsAtIndexpaths:withRowAnimation を呼び出します。コードがお役に立てば幸いです。

    NSInteger statingIndex = [self.tableViewDatasource count];
    NSInteger noOfObjects = //Get the no.of objects count from getFeed method.
    NSMutableArray *indexPaths = [[NSMutableArray alloc] init];

    for (NSInteger index = statingIndex; index < statingIndex+noOfObjects; index++) {

        [_objects addObject:]; // add the object from getFeed method.
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:index inSection:0];
        [indexPaths addObject:indexPath];
        [indexPath release];

    }

    [self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade];
于 2012-12-28T11:49:38.027 に答える
1

insertRowsAtIndexPaths: withRowAnimation:の方法を使用する必要がありUITableViewます。

注意しなければならないことの 1 つは、このメソッドを使用する場合、返される行数は次のtableView:numberOfRowsInSection値と等しくなければならないということです。number_of_existing_rows + number_of_newly_inserted_rows

于 2012-12-28T11:26:03.590 に答える
0

これは、Web サービスからデータを取得するたびに、テーブルにデータを入力するために使用している配列にデータを追加するためである可能性があります。これにより、新しいデータのみが得られ、新しいデータを追加する必要があります。配列にデータを追加し(可変配列にして新しいデータを追加します)、次の行を使用するだけです

[your_Table reloadData];

これがあなたを助けることを願っています。

于 2012-12-28T11:23:54.263 に答える
0

下にスクロールしてロードする代わりに、テーブルビューの最後の行を「さらにアイテムをロード」として使用し、ユーザーがその行を選択したときに、新しいフィードを取得してテーブルビューをリロードします。

また、私はあなたのコードに1つの疑問があります.getfeedメソッドで毎回、配列
collectedDataを作成しています. このデータをテーブルのデータソース データに追加していないのではないかと思います。これにより、テーブルビューに最近のフィード データしか表示されない可能性があります。チェックしてください

于 2012-12-28T11:27:41.890 に答える