2014-06-18 6 views
0

У меня есть ViewController что экземпляр класса Trophy, который делает это:Непризнанный селектор в NSObject

#import "Trophy.h" 
#import "WATrophiesViewController.h" 

@implementation Trophy 


-(id)initWithFrame:(CGRect)frame trophyName:(NSString *)trophyName trophyDesc:(NSString *)trophyDesc imageName:(NSString *)imageName viewController:(UIViewController *)controller 
{ 
    self = [super init]; 
    if (self) 
    { 
     self.view = [[UIView alloc] initWithFrame:frame]; 
     self.trophyName = trophyName; 
     self.trophyDesc = trophyDesc; 
     self.trophyImage = imageName; 
     self.controller = controller; 
    } 
    return self; 
} 

-(UIView *)drawView 
{ 
    // Imposto lo sfondo del frame della view 
    self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"container"]]; 

    // Imposto l'immagine del trofeo 
    UIImageView *image = [[UIImageView alloc] initWithImage:[UIImage imageNamed:self.trophyImage]]; 
    CGRect imageFrame = CGRectMake(0.0f, 0.0f, 138.0f, 191.0f); 
    image.frame = imageFrame; 

    // La disegno 
    [self.view addSubview:image]; 

    // Imposto il titolo del trofeo 
    UILabel *titolo = [[UILabel alloc] initWithFrame:CGRectMake(140.0f, 20.0f, 260.0f, 90.0f)]; 
    titolo.text = self.trophyName; 
    titolo.numberOfLines = 0; 
    titolo.lineBreakMode = NSLineBreakByWordWrapping; 
    titolo.textColor = [UIColor whiteColor]; 

    // Lo disegno 
    [self.view addSubview:titolo]; 

    // Imposto la parte per lo share 
    UIView *shareDiv = [[UIView alloc] initWithFrame:CGRectMake(140.0f, 130.0f, 300.0f, 140.0f)]; 
    UILabel *share = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 300.0f, 30.0f)]; 
    share.text = @"SHARE"; 
    share.textColor = [UIColor whiteColor]; 
    [shareDiv addSubview:share]; 
    UIButton *twitter = [[UIButton alloc] initWithFrame:CGRectMake(0.0f, 30.0f, 40.0f, 40.0f)]; 
    [twitter setBackgroundImage:[UIImage imageNamed:@"tw-iphone"] forState:UIControlStateNormal]; 
    [twitter addTarget:self action:@selector(twitter:) forControlEvents:UIControlEventTouchUpInside]; 
    [shareDiv addSubview:twitter]; 

    UIButton *fb = [[UIButton alloc] initWithFrame:CGRectMake(50.0f, 30.0f, 40.0f, 40.0f)]; 
    [fb setBackgroundImage:[UIImage imageNamed:@"fb-iphone"] forState:UIControlStateNormal]; 
    [fb addTarget:self action:@selector(fb:) forControlEvents:UIControlEventTouchUpInside]; 
    [shareDiv addSubview:fb]; 


    [self.view addSubview:shareDiv]; 

    return self.view; 
} 

-(void)twitter:(id)sender 
{ 

} 
-(void)fb:(id)sender 
{ 

} 
@end 

Но когда я нажимаю на одну из этих двух кнопок происходят ошибки. Зачем? Это ошибка: Нагрузочного приложение из-за неперехваченное исключение 'NSInvalidArgumentException', причина: '- [__ NSArrayM фб]: непризнанный селектор направлен например 0x16e9e7d0'

EDIT: Вот трассировки стека

2014-06-18 14:02:55.953 Wikitude Approx[1027:60b] (
0 Wikitude Approx      0x000f5c57 -[Trophy drawView] + 1446 
1 Wikitude Approx      0x000f48c9 -[WATrophiesViewController viewDidLoad] + 1352 
2 UIKit        0x330f2a53 <redacted> + 518 
3 UIKit        0x3319d30d <redacted> + 32 
4 UIKit        0x3319d223 <redacted> + 230 
5 UIKit        0x3319c801 <redacted> + 80 
6 UIKit        0x3319c529 <redacted> + 572 
7 UIKit        0x3319c299 <redacted> + 44 
8 UIKit        0x3319c231 <redacted> + 184 
9 UIKit        0x330ee305 <redacted> + 380 
10 QuartzCore       0x32d6a31b <redacted> + 142 
11 QuartzCore       0x32d65b3f <redacted> + 350 
12 QuartzCore       0x32d659d1 <redacted> + 16 
13 QuartzCore       0x32d653e5 <redacted> + 228 
14 QuartzCore       0x32d651f7 <redacted> + 314 
15 UIKit        0x330e6a27 <redacted> + 126 
16 CoreFoundation      0x3088a039 <redacted> + 20 
17 CoreFoundation      0x308879c7 <redacted> + 286 
18 CoreFoundation      0x30887d13 <redacted> + 738 
19 CoreFoundation      0x307f2769 CFRunLoopRunSpecific + 524 
20 CoreFoundation      0x307f254b CFRunLoopRunInMode + 106 
21 GraphicsServices     0x3575f6d3 GSEventRunModal + 138 
22 UIKit        0x33151891 UIApplicationMain + 1136 
23 Wikitude Approx      0x000f23e1 main + 116 
24 libdyld.dylib      0x3b553ab7 <redacted> + 2 

)

То есть, как я использовать класс

self.scroll.contentSize = CGSizeMake(414.0f, 3000.0f); 

// Creo il trofeo della prima visita 
Trophy *trofeoPrimaVisita = [[Trophy alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 414.0f, 228.0f) trophyName:@"Hai lanciato per la prima volta l'applicazione" trophyDesc:@"Ho lanciato per la prima volta l'applicazione Hermes" imageName:@"trofeoaudio-guida-5" viewController:self]; 
UIView *trofeoView = [trofeoPrimaVisita drawView]; 
[self.scroll addSubview:trofeoView]; 
+1

Я не думаю, что ошибка в коде, который вы отправили. Отправьте стопку, пожалуйста. – trojanfoe

+0

Похоже, что ваш экземпляр объекта Trophy был выпущен, вам нужно постоянно ссылаться на него. – robert

+0

'NSInvalidArgumentException ', причина:' - [__ NSArrayM fb:]: непризнанный селектор, отправленный в экземпляр 0x16e9e7d0' по какой-либо причине метод' fb' вызывается в 'NSMutableArray', который, конечно же, не реализует метод' fb' – nburk

ответ

1

Держите ссылку на trofeoPrimaVisita как свойство вызывающего, а не как локальная переменная.

Я предполагаю, что вы используете ARC, и объект (Trophy), который реализует fb:, был выпущен к моменту нажатия кнопки.

+0

Я думал об этом, но потом мне нужно создать более одного объекта Trophy в WATrophiesViewController, поэтому я не могу этого сделать. –

+0

Я не уверен, что вы подразумеваете под «нужно сгенерировать», но вам нужно, чтобы объект был сильно привязан, если вы хотите избежать сбоя. Если вам нужно много из них, используйте массив или набор или словарь ... что имеет смысл. –

+0

Я использую a для создания экземпляров и создания X-трофеев, поэтому, если я объявляю сильное свойство, это будет заполнено последним объектом. –

-2

просто удалить двоеточие ˙U пу t после имени метода в селекторе. например, заменить @selector(fb:) на @selector(fb). Я надеюсь, что эта помощь :)

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