2014-12-22 6 views
-3

Я запускаю свое приложение, которое загружает изображения в виде таблицы с сервера синтаксического анализа. Я обновил код, и теперь это моя ошибка: - [UIImageView setDelegate]: непризнанные селектор направлен например 0x156b6890Почему я получаю непризнанный селектор?

Обычно я могу исправить свои проблемы в конце концов, но я понятия не имею, как даже начать пытаться исправить это пожалуйста, помогите.

Вот мой .m:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 
if (section == self.objects.count) { 
    return nil; 
} 
static NSString *CellIdentifier = @"SectionHeaderCell"; 
PFTableViewCell *sectionHeaderView = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    // PFImageView *profileImageView = (PFImageView *)[sectionHeaderView viewWithTag:1]; 
UILabel *userNameLabel = (UILabel *)[sectionHeaderView viewWithTag:2]; 
UILabel *titleLabel = (UILabel *)[sectionHeaderView viewWithTag:3]; 

PFObject *photo = [self.objects objectAtIndex:section]; 

PFUser *user = [photo objectForKey:@"whoPosted"]; 
// PFFile *profilePicture = [user objectForKey:@"ProfilePicture"]; 
NSString *title = photo[@"title"]; 


userNameLabel.text = user.username; 
titleLabel.text = title; 



//profileImageView.file = profilePicture; 
//[profileImageView loadInBackground]; 


//follow button 
FollowButton *followButton = (FollowButton *)[sectionHeaderView viewWithTag:4]; 
followButton.delegate = self; 
followButton.sectionIndex = section; 

if (!self.followingArray || [user.objectId isEqualToString:[PFUser currentUser].objectId])  { 
    followButton.hidden = YES; 
} 
else { 
    followButton.hidden = NO; 
    NSInteger indexOfMatchedObject = [self.followingArray indexOfObject:user.objectId]; 
    if (indexOfMatchedObject == NSNotFound) { 
     followButton.selected = NO; 
    } 
    else { 
     followButton.selected = YES; 
    } 
    } 

    return sectionHeaderView; 
    } 

Когда я запустить приложение прямо сейчас он загружает одно изображение без информации с ним, и он просто говорит, что загрузка и никогда не загружает ничего другого. Мое приложение должно, по крайней мере, загружать 5 изображений и, по крайней мере, использовать текст. Я не уверен, что я изменил это. Благодарю.

Моя кнопка Следование в раскадровке имеет класс FollowButton вот .m: #import «FollowButton.h»

@implementation FollowButton 

- (id)initWithCoder:(NSCoder *)aDecoder { 
if (self == [super initWithCoder:aDecoder]) { 
    [self addTarget:self action:@selector(buttonPressed) forControlEvents:UIControlEventTouchUpInside]; 
} 
return self; 
} 


- (void) buttonPressed { 
[self.delegate followButton:self didTapWithSelectionIndex:self.sectionIndex]; 

} 


@end 
+1

Похоже, что заголовок заголовка раздела фактически является 'UIImageView', а не' FollowButton'. – rmaddy

+2

BTW - сузите код в своем вопросе вплоть до соответствующих частей, связанных с сбоем. – rmaddy

+0

«Непризнанный селектор» означает, что вы пытаетесь вызвать метод или получить доступ к объекту, у которого нет такого метода/свойства. Часто это происходит потому, что вы думаете, что объект имеет определенный тип, когда он действительно что-то еще. Например, вы не можете вызывать методы 'String' в' Int', и вы не можете вызывать 'setDelegate' для объекта, у которого нет свойства' delegate', которое является вашей текущей проблемой. Похоже, вы смешиваете 'FollowButton' с UIImageView, у которого нет делегата. – mc01

ответ

1

Как вы сказали в комментариях, проблема эти два линии:

FollowButton *followButton = (FollowButton *)[sectionHeaderView viewWithTag:4]; 
followButton.delegate = self; 

проблема заключается в том, что ваш viewWithTag:4 оказывается быть UIImageView - и UIImageViews нет делегатов. Очевидно, вы видите неправильный вид здесь. Проверьте нумерацию ваших тегов!


Дополнительные комментарии:

  • Вы можете сказать это FollowButton (и ваш код делает так сказать), но это не значит, что это один. Это то, что это - что это действительно есть. Другими словами, когда вы бросаете эту вещь в FollowButton, вы случайно лжете.

  • Причина, по которой в сообщении об ошибке упоминается setDelegate:, заключается в том, что установка чего-то свойства delegate идентична вызову метода setDelegate:.

Надеемся, что эта информация поможет вам отследить такую ​​же ошибку в будущем, так как вы ее увидите. Я предполагаю, что «непризнанный селектор» является самой распространенной ошибкой во время выполнения. Научитесь любить его (и исправить).

+0

Мой тег 4 - это UIButton tho @matt :(Вот почему я так смущен. Я просто проверял, чтобы теги были правильными. – Caler

+0

@Caler попробуйте фрагмент кода в моем ответе ниже, установите точку останова на второй строке , и проверьте view4 ... там явно есть случай, когда это то, что не позволяет делегату, UIImageView, как указано в сообщении об ошибке. – RobP

+0

@Caler Верьте во время выполнения. Он знает больше, чем вы. – matt

0

Рассмотрим эти строки кода:

PFTableViewCell *sectionHeaderView = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
... 
FollowButton *followButton = (FollowButton *)[sectionHeaderView viewWithTag:4]; 
followButton.delegate = self; 

Актерский к (FollowButton *) небезопасно! По крайней мере, проверить его:

UIView *view4 = [sectionHeaderView viewWithTag:4]; 
if([view4 isKindOfClass:[FollowButton class]]) { 
    FollowButton *followButton = (FollowButton *) view4; 
    followButton.delegate = self; 
} else { 
    NSLog(@"I got the wrong view: %@", view4); 
} 

В десятки тысяч строк кода IOS я написал, я поражен, как редко это правильно сделать приведение типа. Они являются источником многих ошибок, и если у вас нет способа вернуть верный тип, это возможный предупреждающий знак. И ВСЕГДА проверяйте свои методы, потому что в противном случае ошибки времени выполнения трудно диагностировать ...

+0

«Как редко правильно делать тип». К сожалению, это просто неправда. Методы часто возвращают 'id' или некоторый общий тип выше, чем реальный тип (UIViewController, UIView и т. Д.). У вас нет выбора, кроме как сбрасывать реальный тип, чтобы получить правильную проверку типов компилятора. – matt

+0

@ Калер вы говорите, что он тоже не рухнул? – RobP

+0

@matt какие методы возвращают 'id'? Очень взгляд на рамки Apple. И если вы используете (instancetype) правильно, очень немногие из ваших собственных должны также. Меня интересуют ваши примеры. – RobP

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