SetDelegate вызывает исключение «неопознанный селектор»

У меня есть UICollectionView, каждая из ячеек которого содержит продукт.
Поскольку я загружаю изображения по запросу, чтобы сохранить низкую пропускную способность, я хочу обновить UICollectionViewCell после завершения загрузки с изображением продукта вместо заполнитель.

Итак, у меня есть следующее:

Продукт.ч

@class Product;
@protocol CWProductDelegate
-(void)CWProductDidFinishLoadingImages:(Product *)product;
@end

@interface Product : NSManagedObject

@property (nonatomic, retain) NSData * bottleImage;
@property (nonatomic, retain) NSData * bottleImage2x;
@property (nonatomic, strong, getter = chooseBottleImage) NSData * stdBottleImage;
@property (nonatomic, retain) NSNumber * isAvailable;
@property (nonatomic, retain) NSData * labelImage;
@property (nonatomic, retain) NSData * labelImage2x;
@property (nonatomic, strong, getter = chooseLabelImage) NSData * stdLabelImage;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSString * origin;
@property (nonatomic, retain) NSData * pourImage;
@property (nonatomic, retain) NSData * pourImage2x;
@property (nonatomic, strong, getter = choosePourImage) NSData * stdPourImage;
@property (nonatomic, retain) NSDecimalNumber * price;
@property (nonatomic, retain) NSString * productCode;
@property (nonatomic, retain) NSString * productDescription;
@property (nonatomic, retain) NSString * scent;
@property (nonatomic, retain) NSString * setting;
@property (nonatomic, retain) NSString * vintage;
@property (nonatomic, retain) NSString * wineType;
@property (nonatomic, retain) NSString * varietal;
@property (nonatomic, retain) NSManagedObject *lineitem;
@property (nonatomic, retain) NSSet *merchantViews;
@property (nonatomic, weak) id <CWProductDelegate> delegate;
@end

@interface Product (CoreDataGeneratedAccessors)

+ (void)manage:(Product *)product merchantViews:(NSArray *)merchantViews;
+ (NSArray *)redWines;
+ (NSArray *)whiteWines;
+ (NSArray *)whiteRecommendations;
+ (NSArray *)redRecommendations;


- (void)addMerchantViewsObject:(NSManagedObject *)value;
- (void)removeMerchantViewsObject:(NSManagedObject *)value;
- (void)addMerchantViews:(NSSet *)values;
- (void)removeMerchantViews:(NSSet *)values;
- (void)getProductImages;
- (void)fetchRetinaImages;

@end

CWProductCell.h

@interface CWProductCell : UICollectionViewCell <CWProductDelegate>

@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@property (weak, nonatomic) IBOutlet UILabel *productName;
@property (strong, nonatomic) Product *product;


-(void)setLabelText:(NSString *)text;
-(void)addImagesToScrollView;

@end

(Материал CollectionView)

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
  CWProductCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"ProductCell" forIndexPath:indexPath];


if (indexPath.row < _redRecommendations)
{
  Product *product = _redWineArray[indexPath.row];
  [product setDelegate:cell];
  ####### THIS IS WHERE THE EXCEPTION IS RISED#####
  cell.product = product;
  cell.productName.text = cell.product.name;

  [cell addImagesToScrollView];

} else {
  Product *product = _whiteWineArray[indexPath.row - _redRecommendations];
  cell.product = product;
  cell.productName.text = cell.product.name;
  [cell addImagesToScrollView];
}
  UITapGestureRecognizer *tapCell = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapCell:)];
  [cell.scrollView addGestureRecognizer:tapCell];


  return cell;
}

Я получаю следующую ошибку:

-[Product setDelegate:]: нераспознанный селектор отправлен экземпляру 0x995f350.


person Martin Lang    schedule 09.10.2013    source источник
comment
Что такое Product класс? Я считаю, что unrecognized selector означает, что объект, которому вы отправляете сообщение, не имеет метода с таким именем. (В вашем классе Product нет метода setDelegate:).   -  person nhgrif    schedule 10.10.2013
comment
Разместите свой класс продукта. Вы уверены, что у него есть свойство делегата?   -  person SomeGuy    schedule 10.10.2013
comment
Обновлен до полного класса, извините за это!   -  person Martin Lang    schedule 10.10.2013


Ответы (3)


Я исправил это, добавив:

делегат @synthesize;

к Product.m

person Martin Lang    schedule 10.10.2013

Это ваш Product.h, который определяет public properties и methods класса Product.

@class Product;
@protocol CWProductDelegate
-(void)CWProductDidFinishLoadingImages:(Product *)product;
@end

Это не включает метод setDelegate:. Если вы включили этот метод в y

person nhgrif    schedule 09.10.2013
comment
Обновил Product.H, извините за это. - person Martin Lang; 10.10.2013

Является ли объект из _redWineArray[indexPath.row]; определенно экземпляром продукта?

//Неправильно Используйте @property(nonatomic, weak) id<CWProductDelegate> delegate;

person Ben Avery    schedule 09.10.2013
comment
(Сделал так, тот же результат). Не должно быть никакой разницы в установке его через стенографию, верно? - person Martin Lang; 10.10.2013
comment
Нет, я так не думаю. Всего лишь уточняю. - person Ben Avery; 10.10.2013
comment
@BenAvery Вам не нужно nonatomic для создания сеттера и геттера. Атомарные свойства также получают синтезированные сеттеры и геттеры. - person rmaddy; 10.10.2013
comment
@rmaddy Спасибо, понятия не имею, где я придумал одну из тех странных вещей, которые я предполагал по пути. - person Ben Avery; 10.10.2013
comment
Даже при использовании неатомарного, это на самом деле не меняет результат :) - person Martin Lang; 10.10.2013
comment
И да, продукт не равен нулю, а является экземпляром продукта. - person Martin Lang; 10.10.2013
comment
Могу ли я переместить ответ в комментарий? - person Ben Avery; 10.10.2013
comment
Похоже, что ваше свойство Product объявляет свойство делегата, и с последним компилятором llvm, который должен синтезировать методы получения и установки. Опубликуйте код, который заполняет ваш массив _redWine объектами Product. - person Duncan C; 10.10.2013