2010-12-05 50 views
4

Je suis un nouveau dans iOS, et j'ai du mal à mettre en œuvre @protocol désolé si vous pensez que cela est une chose facile ..Fail dans l'attribution self.delegate il produire sélecteur non reconnu envoyé

i » J'ai été chercher autour de stackoverflow.com, les webs et aussi essayer oncle Google pendant un moment et j'ai décidé de demander ici ...

L'idée principale est d'appeler un MyViewController à partir de TopViewController et faire flip animation Je commence par créer le protocoles ..

// This is my Delegate header 
    // MyViewController.h 

    @protocol MyViewControllerlDelegate 

    - (void) myViewControllerDidFinish; 

    @end 

    @interface MyViewController : UIViewController 
    { 
    id <MyViewControllerlDelegate> delegate; 
    } 

    @property (nonatomic, assign) id <MyViewControllerlDelegate> delegate; 

    - (IBAction) done; 

    @end 

et ci-dessous est la mise en œuvre:

// MyViewController.m 

    #import "MyViewController.h" 

    @implementation MyViewController 

    @synthesize delegate; 

    // Another Code above 

    - (IBAction)done 
    { 
    [self.delegate myViewControllerDidFinish]; 
    } 

    // Another Code Below 

    @end 

J'utilise ci-dessus objet à appeler d'une autre vue ci-dessous et ajouter la transition chiquenaude en elle:

// TopViewController.h 

#import "MyViewController.h" 

@class MapScrollView; 

@interface TopViewController : UIViewController <UIScrollViewDelegate,MyViewControllerlDelegate> 
{ 
    UIScrollView *topScrollView; 
    UIButton *infoButton; 
} 

@end 

TopViewController.h mise en œuvre // TopViewController. m

#import "TopViewController.h" 
#import "CustomScrollView.h" 
#import <QuartzCore/QuartzCore.h> 

- (void)loadView 
{  
    // Step 1: make the outer paging scroll view 
    CGRect topScrollViewRect = [[UIScreen mainScreen] bounds]; 
    topScrollView = [[UIScrollView alloc] initWithFrame:topScrollViewRect]; 
    topScrollView.pagingEnabled = YES; 
    topScrollView.backgroundColor = [UIColor blackColor]; 
    topScrollView.showsVerticalScrollIndicator = NO; 
    topScrollView.showsHorizontalScrollIndicator = NO; 
    topScrollView.contentSize = CGSizeMake(topScrollViewRecte.size.width, 
               topScrollViewRecte.size.height); 
    topScrollView.delegate = self; 
    self.view = pagingScrollView; 

    CustomScrollView *sView = [[[MapScrollView alloc] init] autorelease]; 

    sView.frame = [[UIScreen mainScreen] bounds]; 

    [sView displayTiledMap]; 

    [pagingScrollView addSubview:sView]; 

    // add Info Button 
    UIButton *button = [UIButton buttonWithType:UIButtonTypeInfoDark]; 
    [button addTarget:self action:@selector(infoIsTouch:) forControlEvents:UIControlEventTouchDown]; 
    button.frame = CGRectMake(282.0, 440.0, 18.0, 19.0); 
    [self.view addSubview:button]; 
} 

-(void)infoIsTouch:(id)sender 
{ 
MyViewController *myView = 
[[MyViewController alloc] initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]]; 
myView.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
     // 
     //Here where the code is crash 
     // 
[myView setDelegate:self]; 
     // 
     //Code from here to below is not run... 
     // 
[self presentModalViewController:myView animated:YES]; 
[myView release]; 
} 

- (void) myViewControllerDidFinish 
{ 
[self dismissModalViewControllerAnimated:YES]; 
} 

etc... 

@end 

Ci-dessous les produits de code suivant erreur du compilateur ..

2010-12-06 01:09:07.946 MyViewDelegatePractice[9473:207] -[TopViewController setDelegate:]: unrecognized selector sent to instance 0x5f30fb0 
2010-12-06 01:09:07.949 MyViewDelegatePractice[9473:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[TopViewController setDelegate:]: unrecognized selector sent to instance 0x5f30fb0' 
*** Call stack at first throw: 
(
    // Cuts... 
) 
terminate called after throwing an instance of 'NSException' 

Les erreurs est déclenché lorsque je presse infoButton qui appellent - (void) infoIsTouch: (id) méthode de l'expéditeur, puis arrêt à [myView setDelegate: auto] ligne .. Quelqu'un pourrait-il me donner un indice où est mes erreurs est ?

NOTE: Si vous dégoûter de mon anglais .. ne hésitez pas à commenter buter cela aussi .. mais avant cela .. Je suis désolé d'avoir mon mieux ..

+0

'MyViewControllerlDelegate' et' FanglesMapSettingViewControllerDelegate', lequel est-il supposé implémenter? Je suis confus. – BoltClock

+0

@ sam-ritchie - merci sam, c'est ma faute de frappe .. j'ai oublié de changer les variables .. désolé bout ce .. – FerryHtw

+0

j'ai changé FanglesMapSettingViewControllerDelegate à MyViewControllerlDelegate mais toujours produire la même erreur .. – FerryHtw

Répondre

2

Je pense que vous avez une autre variable nommée myView ici, qui intercepte votre appel à l'instance MyViewController que vous venez de créer. Essayez de changer le nom de cette instance, et voyez ce qui se passe.

Autres choses: ressemble à une faute de frappe dans votre implémentation de MyViewController. Modifiez cette ligne:

@implementation FanglesMapSettingsViewController 

à ceci:

@implementation MyViewController 

Et vous devriez être bon d'aller. (Vous obtenez cette erreur parce que le fichier d'en-tête ne correspond à aucune implémentation, à cause de la faute de frappe, donc vous ne bénéficiez jamais de votre appel @synthesize delegate;

De même, assurez-vous de déclarer le bon protocole dans TopViewController :

@interface TopViewController : UIViewController <UIScrollViewDelegate, MyViewControllerlDelegate> 

Et changer votre déclaration de protocole:.

@protocol MyViewControllerlDelegate<NSObject> 

Autre que cela, les choses se présentent bien

+0

@ sam-ritchie - merci sam , c'est ma faute de frappe .. j'ai oublié de changer les variables .. désolé à ce sujet .. – FerryHtw

+0

@ sam-ritchie - encore erreur, j'ai effectivement modifié les codes avant que je ai soumis .. et il produit toujours une erreur .. – FerryHtw

+0

Ferry, sont vous obtenez exactement la même erreur? –

3

Avez-vous @synthesize delegate; quelque part? Oh, voilà. Derp. OK - so - ceci est une erreur d'exécution.Les avertissements du compilateur, etc, devraient être damnés (je veux dire - corrigez-les, définitivement, mais le compilateur génère du code qui tourne et se bloque). Un sélecteur non reconnu signifie qu'une tentative a été faite pour invoquer une méthode sur un objet où cet objet ne répond pas à ladite méthode. Dans ce cas, le backtrace n'est pas susceptible d'être terriblement utile; vous avez déjà identifié l'emplacement du crash et pourquoi il plante. Essayez de définir un point d'arrêt sur la ligne qui plante, puis utilisez le débogueur pour interroger ledit objet;

po object 
po (id) [object class] 
p (BOOL) [object respondsToSelector: @selector(setDelegate:)] 

... etc ...

Il y a quelque chose qui se passe, mais je ne vois pas probablement terriblement évident qu'il désinvolte.

+0

On dirait qu'il a inclus @synthesize delegate; dans MyViewController.m. –

+0

Je pense qu'il doit avoir une autre variable nommée myView. Le code a l'air correct, certainement pas médiocre d'une manière qui produirait cette erreur ... –

8

Ancien post, mais pour toute personne ayant le même problème, veillez à définir la classe dans l'inspecteur d'identité sur la classe correcte. C'était mon problème. Probablement la chose la plus oubliée de Xcode.

+0

* ceci * ... merci beaucoup, donc les story-boards sont finicky :) –

+0

Dans mon cas, j'ai fait par erreur la classe que le segue venait de la même classe que la destination – mhmdshawqi