将存储在NSArray中的图像添加到UITableView
首先,我是编程新手,我试图创build一个具有UITableView
的应用程序,并显示存储在数组中的名称,并在每个名称之外显示图像(图标)。 我已经添加了三个图像,并命名为1.jpg
, 2.jpg
和3.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]];
你的数组是填充文件名,而不是图像。 您需要使用文件名获取图像。 你可以用UIImage
的imageNamed
方法来做到这一点。 这将从应用程序包中获取图像。
试试这个: 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; }
只要更换这两个方法就可以了
- 更改自定义tableViewCell的背景颜色
- 更改单元格的圆angular半径insie分组的UITableView
- 如何使用button操作(带参数)从自定义UITableViewCell中推送视图
- UITableView重复Firebase数据
- 为什么不能设置cell.selectionStyle = UITableViewCellSelectionStyleBlue?
- 删除表格单元会导致崩溃
- 如果在一个ViewController中使用两个UITableView,而另一个使用自定义单元格refrence,而另一个则很简单
- 为UITableView调用beginUpdates / endUpdates有什么好处,而不是这样做?
- 如何避免UITableViewCell重复添加自定义标签时,TableView滚动?