2010-07-16 6 views
4

J'ai un projet simple pour présenter un contrôleur de vue modale et retransmettre une chaîne basée sur le bouton du VC modal qui est enfoncé. J'ai basé tout cela sur regarder la classe de Stanford sur iTunes U. Il semble que j'ai tout correct, mais je reçois quelques avertissements du compilateur.Implémentation des méthodes de délégué pour le transfert de données de contrôleur de vue modale

D'abord je reçois un appelé passing argument 1 of 'setDelegate:' from incompatible pointer type dans TransferViewController.m

Deuxièmement, je reçois quatre avertissements appelé Invalid receiver type 'id <MyModalViewControllerDelegate>*' mais ceux-ci ne sont pas affichés dans la zone des résultats de construction, plutôt à côté des lignes incriminées dans MyModalViewController.m, les deux lignes dans chacune des actions de bouton.

est ici le code ...

// TransferViewController.h 

#import <UIKit/UIKit.h> 
#import "MyModalViewController.h"; 

@interface TransferViewController : UIViewController <MyModalViewControllerDelegate> { 
    UILabel *label; 
    UIButton *button; 
} 

@property (nonatomic, retain) IBOutlet UILabel *label; 
@property (nonatomic, retain) UIButton *button; 

- (IBAction)updateText; 

@end 

// TransferViewController.m 

#import "TransferViewController.h" 

@implementation TransferViewController 

@synthesize label; 
@synthesize button; 

- (IBAction)updateText { 
    MyModalViewController *myModalViewController = [[MyModalViewController alloc] init]; 
    myModalViewController.delegate = self; // I get the warning here. 
    [self presentModalViewController:myModalViewController animated:YES]; 
    [myModalViewController release]; 
} 

- (void)myModalViewController:(MyModalViewController *)controller didFinishSelecting:(NSString *)selectedDog { 
    label.text = selectedDog; 
    [self dismissModalViewControllerAnimated:YES]; 
} 

@end 

// MyModalViewController.h 

#import <UIKit/UIKit.h> 

@protocol MyModalViewControllerDelegate; 

@interface MyModalViewController : UIViewController { 
    UIButton *abby; 
    UIButton *zion; 
    id <MyModalViewControllerDelegate> delegate; 
} 

@property (assign) id <MyModalViewControllerDelegate> delegate; 

- (IBAction)selectedAbby; 
- (IBAction)selectedZion; 

@end 

@protocol MyModalViewControllerDelegate <NSObject> 

@optional 

- (void)myModalViewController:(MyModalViewController *)controller didFinishSelecting:(NSString *)selectedDog; 

@end 

// MyModalViewController.m 

#import "MyModalViewController.h" 

@implementation MyModalViewController 

@synthesize delegate; 

- (IBAction)selectedAbby { 
    if ([self.delegate respondsToSelector:@selector (myModalViewController:didFinishSelecting:)]) { 
     [self.delegate myModalViewController:self didFinishSelecting:@"Abby"]; 
    } 
} 

- (IBAction)selectedZion { 
    if ([self.delegate respondsToSelector:@selector (myModalViewController:didFinishSelecting:)]) { 
     [self.delegate myModalViewController:self didFinishSelecting:@"Zion"]; 
    } 

} 

Répondre

4

Débarrassez-vous de ces * s après id <something> et bef minerai delegate.

Alors fais

id <MyModalViewControllerDelegate> *delegate; 

cette

id <MyModalViewControllerDelegate> delegate; 
+0

Merci encore! Je suppose que j'ai menti dans mon autre question quand j'ai dit que j'avais compris le concept de l'utilisation d'un délégué, mais je pense que je le fais maintenant. Lorsque je définis une méthode déléguée dans le conteneur virtuel parent, car il est implémenté dans le parent, il a accès aux ivars dans le parent. Lorsque le VC modal utilise cette méthode, il renvoie un canal au parent. – Steve

+0

En ce qui concerne la question de type invalide, je pense que c'est l'un de ces cas où Objective-C étant si permissif m'a mordu. Il était heureux de me laisser définir incorrectement le délégué comme un pointeur, mais seulement s'est fâché quand j'ai réellement essayé de l'utiliser de cette façon - un indice sur la façon dont je l'ai défini serait bien dans l'avertissement du compilateur. Peut-être en xCode 4! – Steve

+0

Yup, on dirait que vous l'obtenez :) Un délégué pointe toujours vers un objet, donc si vous diriez SomeDelegateClass * délégué, vous aurez toujours besoin de *, la chose est que l'ID a déjà ce 'dedans' vous n'avez donc pas besoin de l'écrire explicitement. –

Questions connexes