4

tableViewに10行を追加しようとしていますが、forループでinsertRowsAtIndesPathsを使用してreloadData imの代わりに、一度に1行を追加する代わりに、最後に10行すべてを追加します。これが私のコードです...

if([[[[[notification userInfo] objectForKey:@"cityevent"]objectForKey:@"events"]objectForKey:@"event"] isKindOfClass:[NSArray class]])
{
    [self.featuredEventTableView beginUpdates];
    for(NSDictionary *tempDict in [[[[notification userInfo] objectForKey:@"cityevent"]objectForKey:@"events"]objectForKey:@"event"])
    {
        ESEvent *event=[[ESEvent alloc]init];
        event.name=[tempDict objectForKey:@"name"];
        if([[tempDict objectForKey:@"image"]isKindOfClass:[NSNull class]] || [tempDict objectForKey:@"image"] ==nil)
            event.image=[UIImage imageNamed:@"category_default.png"];
        else
        {
            event.image=[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[tempDict objectForKey:@"image"]]]];
        }
        [events addObject:event];        
        NSIndexPath *ip=[NSIndexPath indexPathForRow:([events count]-1) inSection:0];
        NSLog(@"row: %i section: %i",ip.row,ip.section);
        [self.featuredEventTableView insertRowsAtIndexPaths:[NSArray arrayWithObject:ip] withRowAnimation:UITableViewRowAnimationRight];
        [self.featuredEventTableView endUpdates];
    }
}

助言がありますか?

4

4 に答える 4

1

開始更新呼び出しを呼び出しの直前に移動しますinsertRowsAtIndexPaths:。それが役立つかどうかを確認してください。end updateを複数回呼び出しますが、開始は1回だけなので、これがまったく機能することに驚いています。

実際、これはおそらくまだ非常に高速なので、気付かないでしょう。NSTimerまたはGCDをdispatch_after調べて、更新をずらします。

于 2012-07-03T09:46:31.937 に答える
0

答えはどれもうまくいきませんでした。私はNSTimerを次のように使用しました...

 tableTimer=[NSTimer scheduledTimerWithTimeInterval:0.4f target:self selector:@selector(performTableUpdates:) userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:i],@"count", nil] repeats:YES];

-(void)performTableUpdates:(NSTimer*)timer
{
    NSLog(@"%i",i);
    NSIndexPath *ip=[NSIndexPath indexPathForRow:i inSection:0];
    [newArray addObject:[events objectAtIndex:i]];
    [self.featuredEventTableView beginUpdates];
    [self.featuredEventTableView insertRowsAtIndexPaths:[NSArray arrayWithObject:ip] withRowAnimation:UITableViewRowAnimationLeft];
    [self.featuredEventTableView endUpdates];

    if(i<[events count])
    {
        if([events count]-i==1)
        {
            [tableTimer invalidate];
            i++;
        }
        else
            i++;
    }
}
于 2012-07-03T11:48:10.563 に答える
0

この場合、forループは重要ではありません。OSはすべてのアニメーションアクションを蓄積し、それらを一緒にコミットします。これを正しく行うには、アニメーション停止セレクターを使用し、外部メソッドを呼び出して、すべてのセルが追加されるまで次のセルを追加する必要があります。

于 2012-07-03T09:45:06.647 に答える
0

reloadDataを使用しない理由...これは、UIに表示したいものに役立つと思います。forループを使用して、実際の配列に1つのデータを追加し、最後にreloadを呼び出すと、その効果が得られます。

既存のコードを続行したい場合は[NSThread sleepForTimeInterval:0.5];、私が推測した後に追加してみてください[self.featuredEventTableView endUpdates];。私は自分のMacを使用していないので、テストできません。これにより、現在のスレッドがしばらく一時停止するため、そのアニメーション効果が得られます。

以下のコードを試してください

if([[[[[notification userInfo] objectForKey:@"cityevent"]objectForKey:@"events"]objectForKey:@"event"] isKindOfClass:[NSArray class]])
        {
            for(NSDictionary *tempDict in [[[[notification userInfo] objectForKey:@"cityevent"]objectForKey:@"events"]objectForKey:@"event"])
            {
                ESEvent *event=[[ESEvent alloc]init];
                event.name=[tempDict objectForKey:@"name"];
                if([[tempDict objectForKey:@"image"]isKindOfClass:[NSNull class]] || [tempDict objectForKey:@"image"] ==nil)
                   event.image=[UIImage imageNamed:@"category_default.png"];
                else
                {
                    event.image=[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[tempDict objectForKey:@"image"]]]];
                }
                [events addObject:event];


                NSIndexPath *ip=[NSIndexPath indexPathForRow:([events count]-1) inSection:0];
                NSLog(@"row: %i section: %i",ip.row,ip.section);

// If this don't work then add thread sleep code at here.

[self.featuredEventTableView beginUpdates];             
   [self.featuredEventTableView insertRowsAtIndexPaths:[NSArray arrayWithObject:ip] withRowAnimation:UITableViewRowAnimationRight];
                [self.featuredEventTableView endUpdates];
            }


        }
于 2012-07-03T10:01:39.053 に答える