从tableview中的url为商店图像创建NSMutableArray

时间:2013-03-31 09:35:13

标签: objective-c uitableview uiimageview nsmutablearray

我想从网址(.php? p = 1 & b = 1 显示第一本书的第一张图片)的图书的商店4图像并运行代码并在tableview中使用这些图像。

我也希望在tableview中创建任何单元格并将第一个图像专用于第一个单元格(第二个图像到第二个单元格等)

这是我的代码:

#import "CarTableViewController.h"
#import "CarTableViewCell.h"

@implementation CarTableViewController
{
    NSData *b;
}
@synthesize carImages;
@synthesize carModels; 
- (void)viewDidLoad
{
    [super viewDidLoad];

    NSString *numberbook =[[NSString alloc]initWithContentsOfURL:[NSURL URLWithString:@"http://192.168.1.101/mamal/book.php?all"]];

    NSInteger numbook = [numberbook integerValue];

    NSString *a;

    for (int i = 1; i <=numbook; i++) {
        a = [[NSString alloc]initWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://192.168.1.101/mamal/book.php?info=1&b=%d",i]]];
        NSLog(@"%@",a); //names of book

        if(!carModels){
            carModels = [NSMutableArray array];
        }
        [carModels addObject:a];

        b = [[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://192.168.1.101/mamal/book.php?p=1&b=%d",i]]];
        NSLog(@"%@",b);
        if (!carImages) {
            carImages = [NSMutableArray array];
        }
        [carImages addObject:b];
    }
}


#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return [carModels count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"carTableCell";
    CarTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    if (cell == nil) {
        cell = [[CarTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    cell.modelLable.text = [carModels objectAtIndex:[indexPath row]];

    UIImage *carPhoto = [UIImage imageWithData:b];
    cell.carImage.image = carPhoto;

    return cell;
}

但是当运行此代码模拟器时,在tableview中显示4个单元格,其中有4个不同的名称(正确!我想要这个)和最后一个单元格的任何单元格!!!! ???? XD

2 个答案:

答案 0 :(得分:0)

每次加载新图像时,都会覆盖保存图像数据的实例变量b,因此加载的最后一个是其数据所在的那个。

b = [[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://192.168.1.101/mamal/book.php?p=1&b=%d",i]]];
NSLog(@"%@",b);
if (!carImages) {
    carImages = [NSMutableArray array];
}
[carImages addObject:b];

配置单元格时,将图像设置为此数据,而不是访问carImages数组。

就像你使用carModels一样:     cell.modelLable.text = [carModels objectAtIndex:[indexPath row]];

UIImage *carPhoto = [UIImage imageWithData:[carImages objectAtIndex:[indexPath row]]];
cell.carImage.image = carPhoto;

如果我愿意,可以提出两项改进建议:

  1. 使b成为局部变量。无需将其作为实例变量。您已经看到这可能会导致混淆,从而导致错误。
  2. 在加载数据后立即创建UIImage并将该图像放入carImages数组中。这样,您只需要为每个图像解析一次数据,而不是每次都显示单元格。

    // ...
    NSData* b = [[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://192.168.1.101/mamal/book.php?p=1&b=%d",i]]];
    NSLog(@"%@",b);
    if (!carImages) {
        carImages = [NSMutableArray array];
    }
    UIImage *img = [UIImage imageWithData:b];
    [carImages addObject:img];
    //...
    

    然后,在配置单元格时,您可以执行

    cell.carImage.image = [carImages objectAtIndex:[indexPath row]];
    

答案 1 :(得分:0)

那是因为您为所有单元格重复使用相同的NSData *b变量(因此它们显示了b的最新状态,这是最后一张图像)

进行以下更改

而不是

UIImage *carPhoto = [UIImage imageWithData:b];

DO

UIImage *carPhoto = [[UIImage imageWithData:[carImage objectAtIndex:indexPath.row]];