首先,我是编程的新手,我正在尝试创建一个具有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;
}
答案 0 :(得分:2)
您的数组中填充了文件名,而不是图像。您需要使用文件名获取图像。您可以使用UIImage
的{{1}}方法执行此操作。这将从应用包中获取您的图像。
试试这个:imageNamed
此外,在cell.imageView.image = [UIImage imageNamed:myImages [indexPath.row]];
中,每次循环循环时都会重新创建NSMutableArray。
尝试用以下内容替换viewDidLoad:
viewDidLoad:
答案 1 :(得分:1)
尝试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.
}
答案 2 :(得分:1)
[myImages addObject:[UIImage imageNamed:[NSString stringWithFormat:@"%d.jpg",i]]];
答案 3 :(得分:0)
您的图像名称数组应与names数组的长度匹配。将它们配置为文字并尝试。也就是说,像这样初始化数组:
NSArray *myNames = @[@"A", @"B", @"C"];
NSArray *myImages = @[@"1.jpg", @"2.jpg", @"3.jpg"];
您也可以通过更改图像循环来修复它,以便它不会在每次迭代时创建新的NSMutableArray:
myImages = [NSMutableArray array];
for (int imageNumber =1 ; imageNumber <= 3; imageNumber++) {
[myImages addObject:[NSString stringWithFormat:@"%i.jpg", imageNumber]];
}
请注意,您需要使用图片名称创建图片:
UIImage *actualImage = [UIImage imageNamed:myImages[indexPath.row]];
答案 4 :(得分:0)
好的,所以Objective-C在处理数组方面与其他编程语言不同。在objective-c中,数组可以包含任何对象指针。所以在你的行
myImages= [[NSMutableArray alloc]initWithObjects:[[NSString stringWithFormat:@"%i.jpg", imageNumber ]], nil];
你实际上并没有创建图像并将它们添加到数组中,而是一遍又一遍地创建数组。这样做
[myImages addObject:[UIImage imageNamed:[NSString stringWithFormat:@"%d.jpg",i]]];
答案 5 :(得分:0)
几条评论:
myNames = [[NSMutableArray alloc ]initWithObjects:@"A",@"B",@"C", nil];
可以更好地写成
NSArray *myNames = @[@"A",@"B",@"C"];
现在,你有问题的一行
cell.imageView.image = myImages [indexPath.row];
是不匹配的类型。 cell.imageView.image 的类型为UImage *。您不能使用字符串分配它。 也许这会奏效:
cell.imageView.image = [UIImage imageNamed:myImages [indexPath.row]];
HTH
-Itay
答案 6 :(得分:0)
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;
}
只需更换这两种方法即可。