我想从网址(.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
答案 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;
如果我愿意,可以提出两项改进建议:
b
成为局部变量。无需将其作为实例变量。您已经看到这可能会导致混淆,从而导致错误。在加载数据后立即创建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]];