CollectionView [__NSCFConstantString _isResizable]: нераспознанный селектор отправлен в экземпляр

Я нахожу поток сигнала SIGABRT, когда запускаю свое приложение. Вот сообщение об ошибке: [__NSCFConstantString _isResizable]: нераспознанный селектор отправлен экземпляру 0x5c20.

Проблема исходит от [[self myCollectionView]setDataSource:self]; потому что он исчезает, когда я его комментирую.

Насколько я понимаю, тип источника данных myCollectionView и self не совпадают. Вот почему у меня есть моя ошибка.

Спасибо за вашу помощь

Пьер

Калвиевконтроллер.h

#import <UIKit/UIKit.h>

@interface CalViewController : UIViewController <UICollectionViewDataSource, UICollectionViewDelegate>
@property (weak, nonatomic) IBOutlet UICollectionView *myCollectionView;

@end

Калвиевконтроллер.м

#import "CalViewController.h"

#import "CustomCell.h" 

@interface CalViewController ()
{
    NSArray *arrayOfImages;
    NSArray *arrayOfDescriptions;
}

@end

@implementation CalViewController

- (void)viewDidLoad
{
[super viewDidLoad];

[[self myCollectionView]setDataSource:self];
[[self myCollectionView]setDelegate:self];

arrayOfImages = [[NSArray alloc]initWithObjects:@"chibre.jpg",nil];
arrayOfDescriptions =[[NSArray alloc]initWithObjects:@"Test",nil];
}
- (NSInteger) collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{ 
return [arrayOfDescriptions count];
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{ 
    static NSString *cellIdentifier=@"Cell";
    CustomCell *cell =  ([collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath]);

    [[cell myImage]setImage:[arrayOfImages objectAtIndex:indexPath.item]];
    [[cell myDescriptionLabel]setText:[arrayOfDescriptions objectAtIndex:indexPath.item]];

    return cell;
}

- (NSInteger)numberOfSections:(UICollectionView *) collectionView
                                          {return 1;
                                          }


- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

@end

person GoldXApp    schedule 17.07.2013    source источник
comment
Спасибо, Роб. Это работает сейчас!   -  person GoldXApp    schedule 17.07.2013


Ответы (2)


Ваш arrayOfImages представляет собой массив имен изображений (строк), поэтому setImage с ним работать не будет. Вместо:

[[cell myImage]setImage:[arrayOfImages objectAtIndex:indexPath.item]];

вы, вероятно, имели в виду:

[[cell myImage]setImage:[UIImage imageNamed:[arrayOfImages objectAtIndex:indexPath.item]]];

или, что то же самое:

cell.myImage.image = [UIImage imageNamed:arrayOfImages[indexPath.item]];

Вы даже можете переименовать arrayOfImages в arrayOfImageNames (или просто imageNames или как-то еще), чтобы устранить этот возможный источник путаницы.

(Кстати, это был хороший призыв не помещать фактические изображения в массив. Мы всегда должны создавать объекты изображений в cellForItemAtIndexPath на основе имен изображений в массиве.)

person Rob    schedule 17.07.2013

Попробуйте заменить [[cell myImage]setImage:[arrayOfImages objectAtIndex:indexPath.item]]; на

NSString *imageName = [arrayOfImages objectAtIndex:indexPath.item];
[cell.myImage setImage:[UIImage imageNamed:imageName];

Проблема в том, что прямо сейчас вы пытаетесь присвоить NSString чему-то, что должно быть UIImage.

person Chris Loonam    schedule 17.07.2013