29 votes

Gérer les délégués d'applications et basculer entre les vues

Je reçois un message d'avertissement à propos d'une sémantique question concernant le passage d'un *const _strong type id et n'arrive pas à résoudre, peu importe ce que je change.

J'ai deux points de vue à l'instant, et nous avons écrit ce code. Dans iPadSpeckViewController.m, voici la méthode qui devrait basculer entre les vues:

-(IBAction) touchProducts {
    ProductsViewController *controller = [[ProductsViewController alloc]
            initWithNibName:@"Products" bundle:nil];
    controller.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    controller.delegate = self;
    [self presentModalViewController:controller animated:YES];
}

Et pour ProductsViewController.h:

@interface ProductsViewController : UIViewController {
    id<ProductsViewControllerDelegate> delegate;
}
@property(nonatomic, retain)
    IBOutlet id<ProductsViewControllerDelegate> delegate;

ProductsViewController.m contient:

@synthesize delegate;

Mais les points de vue ne mettez pas... les Pensées?

EDIT: Voici l'avertissement, comme il apparaît sur la ligne "contrôleur.delegate = self;" dans iPadSpeckViewController.m:

/Developer/iPadSpeckApp/iPadSpeckApp/iPadSpeckAppViewController.m:17:27:{17:27-17:31}: warning: passing 'iPadSpeckAppViewController *const __strong' to parameter of incompatible type 'id<ProductsViewControllerDelegate>' [3]

152voto

matt Points 60113

Cet avertissement est curieusement rédigé, mais il est en fait juste une façon de vous dire que la classe de l'auto (quelle que soit la classe est) n'est pas conforme à la ProductsViewControllerDelegate protocole. Pour se débarrasser de l'avertissement, vous avez deux choix:

  • Déclaration de la classe de l'auto (quelle que soit cette classe), en @interface déclaration, conformes au protocole ProductsViewControllerDelegate. Ou...

  • Supprimer l'avertissement en changeant ce:

    controller.delegate = self;
    

    pour cela:

    controller.delegate = (id)self;
    

Le délégué de la propriété est de type id<ProductsViewControllerDelegate>. Mais l'auto n'est pas. En vertu de l'ARC, vous devez faire le cast explicite, ainsi que les types formellement d'accord. (Je crois que c'est ainsi que l'ARC peut faire absolument certain qu'il dispose de suffisamment d'informations pour faire les bons mémoire les décisions de gestion.)

0voto

Christoph H. Points 300

Vous avez la même erreur lorsque j'ai essayé de définir le délégué d'un UINavigationController sur un objet qui a implémenté le mauvais protocole (UINavigationBarDelegate au lieu de UINavigationControllerDelegate). Cela pourrait être une simple faute de frappe.

-1voto

Justin Points 840

Si vous voulez seulement changer de vue, vous pourriez vouloir essayer le code ci-dessous. Il fonctionne pour moi.

ProductsViewController *controller = [[ProductsViewController alloc] initWithNibName:@"Products" bundle:nil];
[self.navigationController pushViewController:controller animated:YES];

J'ai utilisé ça pour avoir mon menu principal de mon application basculer vers le jeu.

Si vous souhaitez une animation spéciale (je pense que j'ai vu se Dissoudre?), cependant, je n'ai aucune idée. Je vais essayer de creuser par le biais de la documentation pour voir, et je vais vous dire ce que j'ai trouver.

Comme pour le "*const_string de type id", bien que je ne sais pas ce que vous essayez de faire avec votre application, je pense que le problème est l' id <ProductsViewControllerDelegate> delegate de votre point de vue contrôleur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X