4

我正在尝试向 tableView 添加 10 行,但不是在 for 循环中使用 insertRowsAtIndesPaths reloadData im,而是一次添加一行,而是在最后添加所有 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 但只启动一次。

实际上,这可能仍然会如此之快,以至于您甚至都没有注意到。查看NSTimer或 GCDdispatch_after以错开更新。

于 2012-07-03T09:46:31.937 回答
0

在这种情况下,for 循环无关紧要 - 操作系统会累积所有动画动作并将它们一起提交。为此,您必须使用动画停止选择器并调用外部方法来添加下一个单元格,直到添加完所有单元格。

于 2012-07-03T09:45:06.647 回答
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

为什么你不使用 reloadData ...我想这将帮助你在你的 UI 上显示什么。如果您使用 for 循环并将一个数据添加到您的实际数组中,最后如果您调用 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 回答