1

URL からの本の 4 つの画像 (.php? p=1 & b=1最初の本の最初の画像を表示) を配列に保存し、そのコードを実行して、これらの画像をテーブルビューで使用します。

また、テーブルビューで任意のセルを作成し、最初の画像を最初のセルに専用にします(2番目の画像を2番目のセルなどに)

これは私のコードです:

#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;
}

しかし、このコードシミュレーターを実行すると、4つの異なる名前を持つテーブルビューに4つのセルが表示され(正しい!これが欲しい)、任意のセルの最後の画像が表示されます!!!!???? XD

4

2 に答える 2

0

これは、すべてのセルに同じNSData *b変数を再利用しているためです (したがって、最後の画像である b の最新の状態が表示されます)。

次の変更を行います

それ以外の

UIImage *carPhoto = [UIImage imageWithData:b];

行う

UIImage *carPhoto = [[UIImage imageWithData:[carImage objectAtIndex:indexPath.row]];
于 2013-03-31T16:30:09.723 に答える
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;

よろしければ、2 つの改善提案:

  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]];
    
于 2013-03-31T16:28:48.443 に答える