2010-08-23 4 views
1

J'ai essayé d'inclure un bouton personnalisé par programme dans un UIView qui est une sous-vue de UITabBarController. Le bouton s'affiche correctement mais lorsque je clique dessus, il se bloque sans message d'erreur. Son étrange que parfois il ne incohérente:UIButton dans un UITabBarController plantant lorsqu'on clique dessus!

 
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSCFString playButton]: unrecognized selector sent to instance 0x632cd10' 

J'ai même essayé de supprimer le code dans ma méthode de bouton de lecture, j'ai essayé de changer le nom playButton à PlayAction, j'ai essayé aussi ajouter le bouton directement à « soi » de ne pas aboutView mais le résultat est toujours le même. Je suppose que cela a quelque chose à voir avec le tabBar ayant un UIView comme sous-vue avec un bouton dessus. Je ne sais pas.

Voici un extrait de code de la façon dont j'ai construit la tabBar dans ma méthode de appDelegate



// About Tab 
aboutViewC = [[[AboutViewController alloc] init] autorelease]; 
aboutNavC = [[[UIViewController alloc] init] autorelease]; 
aboutNavC.title = @"About"; 
aboutNavC.view = aboutViewC.view; 

// Lessons Tab 
lessonsViewC = [[[LevelViewController alloc] init] autorelease]; 
lessonsViewC.title = @"Levels"; 
lessonsNavC = [[[UINavigationController alloc] initWithRootViewController:lessonsViewC] autorelease]; 
lessonsNavC.title = @"Lessons"; 
lessonsNavC.viewControllers = [NSArray arrayWithObjects:lessonsViewC, nil]; 

tabBarController = [[UITabBarController alloc] init]; 
tabBarController.viewControllers = [NSArray arrayWithObjects:aboutNavC, lessonsNavC, nil]; 

et Heres le code pour la mise en œuvre de la classe AboutViewController

AboutViewController.h



#import 
@interface AboutViewController : UIViewController { 
UIButton *playSoundButton; 
UIView *aboutView; 
} 
- (void)playButton; 
@end 

AboutViewController. m


#import "AboutViewController.h" 

@implementation AboutViewController 

- (void)dealloc { 
    [playSoundButton release]; 
    [aboutView release]; 
    [super dealloc]; 
} 

- (void)viewDidLoad { 
aboutView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; 

[playSoundButton = [UIButton buttonWithType:UIButtonTypeCustom] retain]; 
image = [UIImage imageNamed:@"bt_play.png"]; 
[playSoundButton setImage:image forState:UIControlStateNormal]; 
[playSoundButton addTarget:self action:@selector(playButton) forControlEvents:UIControlEventTouchUpInside]; 
playSoundButton.frame = CGRectMake(0, 350, 40, 40); 
[aboutView addSubview:playSoundButton]; 

stopSoundButton.hidden = YES; 
playSoundButton.hidden = NO; 

[self.view addSubview:aboutView]; 

[super viewDidLoad]; 
} 

- (void)playButton 
{ 
NSLog(@"playAction method"); 
} 
@end 

Merci d'avance!

Répondre

0

Merci TOB pour les commentaires, je sais vraiment comment mettre en œuvre conserver la déclaration, il était une faute de frappe, je ne l'ai pas remarquer. étonnamment, ce n'est pas le problème et le code fonctionne bien maintenant laissant la faute de frappe inchangée.

Le vrai problème était dans ma méthode appDelegate. Au lieu de

 
    // About Tab 
    aboutViewC = [[[AboutViewController alloc] init] autorelease]; aboutNavC = [[[UIViewController alloc] init] autorelease]; aboutNavC.title = @"About"; aboutNavC.view = aboutViewC.view; 
    // Lessons Tab 
    lessonsViewC = [[[LevelViewController alloc] init] autorelease]; 
    lessonsViewC.title = @"Levels"; 
    lessonsNavC = [[[UINavigationController alloc] initWithRootViewController:lessonsViewC] autorelease]; 
    lessonsNavC.title = @"Lessons"; 
    lessonsNavC.viewControllers = [NSArray arrayWithObjects:lessonsViewC, nil]; 
    tabBarController = [[UITabBarController alloc] init]; 
    tabBarController.viewControllers = [NSArray arrayWithObjects:aboutNavC, lessonsNavC, nil]; 
devrait être
 
    // About Tab 
    aboutViewC = [[[AboutViewController alloc] init] autorelease]; 
    aboutViewC.title = @"About"; 
    // Lessons Tab 
    lessonsViewC = [[[LevelViewController alloc] init] autorelease]; 
    lessonsViewC.title = @"Levels"; 
    lessonsNavC = [[[UINavigationController alloc] initWithRootViewController:lessonsViewC] autorelease]; 
    lessonsNavC.title = @"Lessons"; 
    lessonsNavC.viewControllers = [NSArray arrayWithObjects:lessonsViewC, nil]; 
    tabBarController = [[UITabBarController alloc] init]; 
    tabBarController.viewControllers = [NSArray arrayWithObjects:aboutViewC, lessonsNavC, nil]; 

0

[playSoundButton = [UIButton buttonWithType:UIButtonTypeCustom] retain]; devrait lire playSoundButton = [[UIButton buttonWithType:UIButtonTypeCustom] retain];

(c.-à-déplacer le premier [ plus droit à UIButton)

Questions connexes