将存储在NSArray中的图像添加到UITableView

首先,我是编程新手,我试图创build一个具有UITableView的应用程序,并显示存储在数组中的名称,并在每个名称之外显示图像(图标)。 我已经添加了三个图像,并命名为1.jpg2.jpg3.jpg

该应用程序运行良好,但告诉应用程序后,我想要显示的数组中存储的图像和运行的应用程序的iOS模拟器的工作,但然后我在我的main.m文件中得到一个绿色的错误?

以下是我的实现文件:

 NSMutableArray *myImages; NSMutableArray *myNames; @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. myNames = [[NSMutableArray alloc ]initWithObjects:@"A",@"B",@"C", nil]; for (int imageNumber =1 ; imageNumber <= 3; imageNumber++) { myImages= [[NSMutableArray alloc]initWithObjects:[[NSString stringWithFormat:@"%i.jpg", imageNumber ]], nil]; } } -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return myNames.count; } -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:@"cell"]; cell.textLabel.text = myNames[indexPath.row]; //everything works fine until i add this line cell.imageView.image = myImages [indexPath.row]; return cell; } 

你的图像名称数组应该匹配名称数组的长度。 将它们configuration为文字并尝试。 也就是说,像这样初始化数组:

 NSArray *myNames = @[@"A", @"B", @"C"]; NSArray *myImages = @[@"1.jpg", @"2.jpg", @"3.jpg"]; 

您也可以通过更改图像循环来修复它,以便在每次迭代时不会创build新的NSMutableArray:

 myImages = [NSMutableArray array]; for (int imageNumber =1 ; imageNumber <= 3; imageNumber++) { [myImages addObject:[NSString stringWithFormat:@"%i.jpg", imageNumber]]; } 

请注意,您需要使用图片名称来创build图片:

 UIImage *actualImage = [UIImage imageNamed:myImages[indexPath.row]]; 

你的数组是填充文件名,而不是图像。 您需要使用文件名获取图像。 你可以用UIImageimageNamed方法来做到这一点。 这将从应用程序包中获取图像。

试试这个: cell.imageView.image = [UIImage imageNamed:myImages [indexPath.row]];

另外,在你的viewDidLoad: ,每当循环循环的时候你都重新创buildNSMutableArray。

尝试用这个replace你的viewDidLoad:

 - (void)viewDidLoad { [super viewDidLoad]; myNames = [[NSMutableArray alloc] initWithObjects:@"A",@"B",@"C", nil]; for (int imageNumber =1 ; imageNumber <= 3; imageNumber++) { [myImages addObject:[UIImage imageNamed:[NSString stringWithFormat:@"%d.jpg",i]]]; } } 

试试dis。

 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. myNames = [[NSMutableArray alloc ]initWithObjects:@"A",@"B",@"C", nil]; myImages= [[NSMutableArray alloc]initWithObjects:[UIImage imagNamed @"1.jpg"],[UIImage imagNamed @"2.jpg"],[UIImage imagNamed @"3.jpg"],]; } -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return myNames.count; } -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ return 1; //number of sections in the table. 1 meaning only 1 section. } -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ UITableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:@"cell"]; cell.myImageView.image = [myImages objectAtIndex:indexPath.row]; cell.myTextLabel.text = myNames[indexPath.row]; return cell; } ; - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } 
 [myImages addObject:[UIImage imageNamed:[NSString stringWithFormat:@"%d.jpg",i]]]; 

好的,所以Objective-C与其他编程语言在处理数组方面不同。 在Objective-C中,数组可以容纳任何对象指针。 所以在你的线

 myImages= [[NSMutableArray alloc]initWithObjects:[[NSString stringWithFormat:@"%i.jpg", imageNumber ]], nil]; 

你实际上不是在创build图像并将它们添加到数组中,而是一遍又一遍地创build数组。 做这个,而不是

 [myImages addObject:[UIImage imageNamed:[NSString stringWithFormat:@"%d.jpg",i]]]; 

几点意见:

  myNames = [[NSMutableArray alloc ]initWithObjects:@"A",@"B",@"C", nil]; 

可以写得更好

  NSArray *myNames = @[@"A",@"B",@"C"]; 

现在,你的问题线

  cell.imageView.image = myImages [indexPath.row]; 

是types的不匹配。 cell.imageView.image的types是UImage *。 您不能使用string进行分配。 也许这将工作:

 cell.imageView.image = [UIImage imageNamed:myImages [indexPath.row]]; 

HTH

-Itay

viewDidLoad中的问题是你在循环中分配你的数组

 - (void)viewDidLoad { [super viewDidLoad]; myNames = [[NSMutableArray alloc ]initWithObjects:@"A",@"B",@"C", nil]; myImages= [[NSMutableArray alloc]init]; for (int imageNumber =1 ; imageNumber <= 3; imageNumber++) { [myImages addObject:[NSString stringWithFormat:@"%i.jpg", imageNumber ]]; } } 

在cellForrowAtIndexPath中的问题是你正在设置NSString代替UIImage

 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:@"cell"]; cell.textLabel.text = myNames[indexPath.row]; cell.imageView.image = [UIImage imageNamed:myNames[indexPath.row]; return cell; } 

只要更换这两个方法就可以了