2010-07-22 6 views
0

Je travaille sur une application iPhone de base pour tester certains événements, et je cours une erreur que je ne peux pas comprendre ou trouver des réponses. Je n'utilise pas IB du tout (à part le MainWindow.xib qu'il crée).iPhone - sélecteur non reconnu, "peut ne pas répondre à addTarget"

À l'heure actuelle, c'est aussi simple que possible.

mainAppDelegate.h

#import <UIKit/UIKit.h> 
#import "mainViewController.h" 

@interface mainAppDelegate : NSObject <UIApplicationDelegate> { 
    UIWindow *window; 
    mainViewController *viewController; 
} 

@property (nonatomic, retain) IBOutlet UIWindow *window; 
@property (nonatomic, retain) mainViewController *viewController; 

@end 

mainAppDelegate.m

#import "mainAppDelegate.h" 

@implementation mainAppDelegate 

@synthesize window; 
@synthesize viewController; 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  

    self.viewController = [[mainViewController alloc] init]; 
    [window addSubview:viewController.view]; 
    [window makeKeyAndVisible]; 

    return YES; 
} 

- (void)dealloc { 
    [viewController release]; 
    [window release]; 
    [super dealloc]; 
} 

@end 

mainViewController.h

#import <UIKit/UIKit.h> 

@interface mainViewController : UIViewController { 

} 

- (void)showMenu; 

@end 

mainViewController.m

#import "mainViewController.h" 

@implementation mainViewController 

- (void)loadView { 
    UIScrollView *mainView = [[UIScrollView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; 
    mainView.scrollEnabled = YES; 
    self.view = mainView;  
    self.view.backgroundColor = [UIColor grayColor]; 

    [self.view setUserInteractionEnabled:YES]; 
    [self.view addTarget:self action:@selector(showMenu) forControlEvents:UIControlEventTouchDown]; 

    [mainView release]; 
} 

- (void)showMenu { 
    NSLog(@"Show Menu"); 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
} 

- (void)viewDidUnload { 
    [super viewDidUnload]; 
} 

- (void)dealloc { 
    [super dealloc]; 
} 

@end 

Maintenant, je reçois un avertissement sur cette ligne:

[self.view addTarget:self action:@selector(showMenu) forControlEvents:UIControlEventTouchDown]; 

qui dit « UIView peut ne pas répondre à« -addTarget: action: forControlEvents:. Et cela n'a pas de sens, car une sous-classe UIView peut certainement répondre à addTarget, et je l'appelle sur self.view, qui doit exister car je ne le libère pas jusqu'à la fin de loadView. (Et même alors, il doit être conservé par le contrôleur)

En regardant une trace montre que l'erreur réelle est - [UIScrollView addTarget: action: forControlEvents:]: sélecteur non reconnu envoyé à l'instance 0x5f11490

Il On dirait que c'est un problème avec le sélecteur lui-même, mais je ne vois rien de mal avec mon sélecteur! Je suis assez déconcerté par cela et toute aide serait géniale.

Répondre

3

D'abord, les classes commencent toujours par des lettres majuscules ....

UIScrollView est une sous-classe de UIView, non UIControl.

UIControl implémente addTarget:action:forControlEvents:. UIScrollView ne fait pas. Ainsi, l'erreur d'exécution.

Si vous souhaitez que quelque chose se produise en réponse à une action effectuée dans l'affichage déroulant, configurez un délégué pour la vue déroulante. Voir UIScrollViewDelegate's documentation.

+0

+1 pour 'UIControl'. Pour plus de détails, 'UIControl' est ce qui vous donne tous ces' UIControlEvents' tels que toucher ou retoucher. Si l'objet n'est pas une sous-classe de 'UIControl', vous ne pouvez pas utiliser ces événements dessus. Un exemple rapide serait d'ouvrir un XIB qui a une vue à l'intérieur. Cliquez sur la vue, allez dans la fenêtre de l'inspecteur et vous verrez qu'il n'a aucun de ces événements de contrôle.Maintenant, si vous passez au dernier onglet de la fenêtre de l'inspecteur et que vous en faites une sous-classe 'UIControl' au lieu de' UIView', elle possède magiquement tous les événements que vous pouvez connecter. – iwasrobbed

+0

Merci, c'est exactement ce que j'avais besoin de savoir. J'aurais dû savoir vérifier ça. Quand vous dites «les classes commencent toujours par des lettres majuscules» - est-ce convention ou nécessaire? –

+1

Objectif-C Convention, bien que beaucoup d'entre nous considèrent comme nécessaire d'éviter la folie induisant la confusion. :) – bbum

0

essayer ce changement subtil

[self.view addTarget:self action:@selector(showMenu:) 
           forControlEvents:UIControlEventTouchDown]; 

et ce

- (void)showMenu:(id) sender { 
    NSLog(@"Show Menu"); 
} 
+0

Merci Aaron, résolu mon problème. Je suivais la documentation officielle de SDK de facebook et le colon manquait. – andyc

Questions connexes