Iphone cellForRowAtIndexPath在滚动异步问题时生涩

时间:2010-10-26 11:15:17

标签: iphone objective-c

我已经发布了我的应用程序,并注意到在CellForRowAtIndexPath中滚动时的混乱,这是因为我通过URL从JSON Feed渲染图像。我搜索了互联网,发现了一些例子,这个我几乎开始工作了。问题是它呈现的图像与正确的标题不匹配。有人可以看看,如果我做了明显错误的事情,那该怎么办。

无论如何,这是我的代码:

- (void)displayImage:(UIImage *)image {
[photo setImage:image]; 

}

-(void)loadImage:(NSString *)url {
NSData* imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:url]];
UIImage* image = [[[UIImage alloc] initWithData:imageData] autorelease];
[imageData release];
[self performSelectorOnMainThread:@selector(displayImage:) withObject:image waitUntilDone:NO];

}

CellForRowAtIndexPath Methord

#define DATELABEL_TAG 1 #define MAINLABEL_TAG 2 #define PHOTO_TAG 3 UIImageView *photo;



- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {




 static NSString *MainNewsCellIdentifier = @"MainNewsCellIdentifier";

UILabel *mainLabel, *dateLabel;


UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: MainNewsCellIdentifier];

if (cell == nil)
{
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier: MainNewsCellIdentifier] autorelease];
    cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;

    dateLabel = [[[UILabel alloc] initWithFrame:CGRectMake(15.0,15.0,170.0,15.0)] autorelease];
    dateLabel.tag = DATELABEL_TAG;
    dateLabel.font = [UIFont systemFontOfSize:10.0];
    dateLabel.textAlignment = UITextAlignmentLeft;
    dateLabel.textColor = [UIColor darkGrayColor];
    dateLabel.autoresizingMask = UIViewAutoresizingFlexibleRightMargin; 
    [cell.contentView addSubview:dateLabel];    

    mainLabel = [[[UILabel alloc] initWithFrame:CGRectMake(15.0,28.0,170.0,60.0)] autorelease];
    mainLabel.tag = MAINLABEL_TAG;
    mainLabel.font = [UIFont boldSystemFontOfSize:14.0];
    mainLabel.textColor = [UIColor blackColor];
    mainLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin;
    mainLabel.numberOfLines = 0;
    [cell.contentView addSubview:mainLabel];


    photo = [[[UIImageView alloc] initWithFrame:CGRectMake(190.0,15.0,85.0,85.0)] autorelease];
    photo.tag = PHOTO_TAG;    
    photo.contentMode = UIViewContentModeScaleAspectFit;

    [cell.contentView addSubview:photo];
}
else {

    dateLabel = (UILabel *)[cell.contentView viewWithTag:DATELABEL_TAG];
    mainLabel = (UILabel *)[cell.contentView viewWithTag:MAINLABEL_TAG];
    photo = (UIImageView *)[cell.contentView viewWithTag:PHOTO_TAG];
}

NSUInteger row = [indexPath row];
NSDictionary *stream = (NSDictionary *) [dataList objectAtIndex:row];
NSString *title = [stream valueForKey:@"title"];


NSString *titleString = @"";

if( ! [title isKindOfClass:[NSString class]] )
{
    titleString  = @"";
}
else
{
    titleString = title;
}

CGSize maximumSize = CGSizeMake(180, 9999);

UIFont *dateFont = [UIFont fontWithName:@"Helvetica" size:14];
CGSize dateStringSize = [titleString sizeWithFont:dateFont
                               constrainedToSize:maximumSize
                                   lineBreakMode:mainLabel.lineBreakMode];

CGRect dateFrame = CGRectMake(15.0, 28.0, 170.0, dateStringSize.height);
mainLabel.frame = dateFrame;

mainLabel.text = titleString;
dateLabel.text = [stream valueForKey:@"created"];

NSString *i = [NSString stringWithFormat:@"http://www.domain.co.uk/images/stories/%@", [stream valueForKey:@"image"]];


photo.image = [UIImage imageNamed:@"i_digital_media.png"];
NSOperationQueue *queue = [NSOperationQueue new];
NSInvocationOperation *operation = [[NSInvocationOperation alloc]
                                    initWithTarget:self
                                    selector:@selector(loadImage:)
                                    object:i];
[queue addOperation:operation];
[operation release];


return cell;}

1 个答案:

答案 0 :(得分:0)

在加载图片时,照片变量会指向不同的照片:)

您需要传递已加载的图像要更新的UIImageView - 尝试使用NSDictionary在线程之间传递变量:

- (void)displayImage:(NSDictionary *)info {
    [[info objectForKey:@"photo"] setImage:[info objectForKey:@"image"]]; 
}


-(void)loadImage:(NSDictionary *)info {
    NSString *imagePath = [info objectForKey:@"imagePath"];
    UIImageView *photo = [info objectForKey:@"photo"];

    // Load the image
    NSData* imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:url]];
    UIImage* image = [[[UIImage alloc] initWithData:imageData] autorelease];
    [imageData release];

    // Pass it back to the main thread
    NSDictionary *mainThreadInfo = [NSdictionary dictionaryWithObjectAndKeys:image, @"image", photo, @"photo", nil]; 
    [self performSelectorOnMainThread:@selector(displayImage:) withObject:mainThreadInfo waitUntilDone:YES];
}

现在,您的操作会将照片和图像数据传回主线程。像这样创建操作:

NSDictionary *info = [NSDictionary dictionaryWithObjectsAndKeys:i, @"imagePath", photo, @"photo", nil];
NSInvocationOperation *operation = [[NSInvocationOperation alloc]
                                    initWithTarget:self
                                    selector:@selector(loadImage:)
                                    object:info];

摆脱全局照片变量:)