2014-08-01 3 views
1

Прежде всего я новичок в программировании, и я пытался создать приложение с UITableView и отображать имена, которые хранятся в массиве, и отображает изображения (значки) помимо каждого имени. Я добавил три изображения в комплект и назвал их 1.jpg, 2.jpg и 3.jpg.Добавление изображений, хранящихся в NSArray, в UITableView

Приложение работает хорошо, но после того, как приложение сообщило, что я хочу отображать изображения, которые хранятся в массиве, и запускать приложение, 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

, что это ошибка? – Mohit

+0

Что такое * green * error? – Jasarien

+0

@MohitPopat i uploaded i photo here https://app.box.com/s/u4biu37l7dsyl8474kur – ALz

ответ

0

Ваш массив имен изображений должен соответствовать длине массива имен. Настройте их как литералы, так и попробуйте. То есть, инициализировать массивы, как это:

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]]; 
+0

Идеальный ответ. но мне интересно, имеет ли длина массива имен HAVE в соответствии с длиной массива изображений или приложение не будет работать? – ALz

+0

Единственное реальное требование состоит в том, что массив myImages по крайней мере до тех пор, пока вы используете в numberOfRowsInSection (так что если представление таблицы запрашивает 10-ю строку, вы не пытаетесь получить доступ к 10-му элементу из 3 -элементный массив). Вы также можете создать новый класс со свойствами (например, imageName, title), чтобы сохранить интересующую вас информацию и заполнить один массив этими объектами. – azsromej

1

Попробуйте Дис.

- (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

В вашем массиве есть имена файлов, а не изображения. Вам нужно получить изображение, используя имя файла. Вы можете сделать это с помощью метода . Это позволит получить изображения из набора приложений.

Попробуйте это: cell.imageView.image = [UIImage imageNamed:myImages [indexPath.row]];

Кроме того, в вашем viewDidLoad:, вы Воссоздание NSMutableArray каждый раз, когда петли цикла.

Попробуйте заменить свой 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]]]; 
    } 

} 
0

Итак, Objective-C в отличие от других языков программирования, в том, как он обрабатывает массивы. В объекте-c массив может содержать любой указатель объекта. Таким образом, в вашей линии

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

вы на самом деле не создавать изображения и добавлять их в массив, вы создаете массив снова и снова. Сделайте это вместо того, чтобы

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

спасибо .. и кажется, что я должен объявить пустой массив перед циклом 'myImages = [NSMutableArray array];' – ALz

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]]; 

НТН

-Itay

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

спасибо .. и кажется, что я должен объявить пустой массив перед циклом 'myImages = [NSMutableArray массива] ' – ALz

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

Проблемы в cellForrowAtIndexP ATH это вы настраиваете 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; 
} 

Просто замените эти два метода И это будет хорошо

Смежные вопросы