来自不同线程的scrollToRowAtIndexPath

时间:2011-02-02 08:14:09

标签: iphone

我正在尝试在tableView上使用scrollToRowAtIndexPath。 我正在使用下面的方法。

当我通过单击UIBarButtonItem调用此方法时,一切正常,意味着 - tableView滚动得很好。但是,当我从另一个线程调用此方法时,它不会滚动。

想法?

-(void)handleDiffView
{
    NSIndexPath * ndxPath;

    if ( !isLooking ) {
        ndxPath= [NSIndexPath indexPathForRow:1 inSection:0];
    }
    else {
        ndxPath= [NSIndexPath indexPathForRow:0 inSection:0];
    }


    [self.tableView scrollToRowAtIndexPath:ndxPath atScrollPosition:UITableViewScrollPositionTop  animated:YES];

}

2 个答案:

答案 0 :(得分:2)

来自Graphics and Drawing in iOS

  

重要说明:UIKit类通常不是线程安全的。所有与绘图相关的操作都应该在应用程序的主线程上执行。

您可以使用–performSelectorOnMainThread:withObject:waitUntilDone:在主线程上调用方法。

答案 1 :(得分:0)

我认为您可以通过调用-[NSObject performSelectorOnMainThread:withObject:waitUntilDone:]来实现,如下所示:

// This will only be called from handleDiffView
- (void)handleDiffViewInMainThread:(NSIndexPath*)ndxPath
{
    [self.tableView scrollToRowAtIndexPath:ndxPath
                          atScrollPosition:UITableViewScrollPositionTop
                                  animated:YES];
}

- (void)handleDiffView {
    NSIndexPath * ndxPath;

    if ( !isLooking ) {
        ndxPath= [NSIndexPath indexPathForRow:1 inSection:0];
    }
    else {
        ndxPath= [NSIndexPath indexPathForRow:0 inSection:0];
    }

    [self performSelectorOnMainThread:@selector(handleDiffViewInMainThread:)
        withObject:ndxPath waitUntilDone:NO];
}