web-dev-qa-db-fra.com

Affectation à 'id <délégué>' du type incompatible 'ViewController * const_strong'

Tout au long de mon application, des avertissements concernant des problèmes sémantiques apparaissent lorsque je définis ViewController.delegate = self. J'ai cherché et trouvé des messages similaires mais aucun n'a pu résoudre mon problème.

ViewController.m:

GameAddViewController *gameAddViewContoller = [[navigationController viewControllers] objectAtIndex:0];
gameAddViewContoller.delegate=self;

Je reçois le message d'erreur lors de la configuration de .delegate=self.

GameAddViewController.h:

@protocol GameAddViewControllerDelegate <NSObject>

- (void)gameAddViewControllerDidCancel:(GameAddViewController *)controller;
- (void)gameAddViewController:(GameAddViewController *)controller didAddGame:(Game *) game;

@end

@interface GameAddViewController : UITableViewController <GameAddViewControllerDelegate>
{
sqlite3         *pitchcountDB;
NSString        *dbPath;
}
@property (nonatomic, strong) id <GameAddViewControllerDelegate> delegate;
...
@end

ViewController.h:

#import "GameAddViewController.h"

@class ViewController;
@protocol ViewControllerDelegate <NSObject>
- (void)ViewControllerDidCancel:(ViewController *)controller;

@end
@interface ViewController : UIViewController <ViewControllerDelegate>
-(void) checkAndCreateFile;
@end

Quelqu'un peut-il m'indiquer la bonne direction pour résoudre les messages d'avertissement?

75
David L

A cette ligne:

gameAddViewContoller.delegate=self; 

Notez que self est du type ViewController qui ne respecte PAS le protocole GameAddViewController 

76
giorashc

Pour moi, ce qui a fini par arriver, c'est que je n'ai pas ajouté le délégué à l'interface @interface de mon fichier d'en-tête.

Par exemple

@interface TheNameOfYourClass : UIViewController <TheDelegatorClassDelegate>

@end
58

Vous mettez le <GameAddViewControllerDelegate> au mauvais endroit. Il ne va pas sur GameAddViewController, mais sur ViewController.

12
borrrden

Cela pourrait aider d'autres personnes qui ajoutent la connectivité Multipeer directement à un ViewController. En haut de myViewControllerName.h, ajoutez '<MCSessionDelegate>':

@interface myViewControllerName : UIViewController<MCSessionDelegate>
3
Custom Bonbons

aussi, si vous définissez votre délégué sur xx.m, mais que vous l'utilisez dans une autre classe. vous pouvez avoir ce problème. alors, il suffit de mettre le protocole définir sur xx.h, quand cela est nécessaire.

1
Michael Tangs

Sur les projets hybrides, vous devez ajouter vos délégués au fichier .h au lieu du fichier .m

0
oskarko

Si vous avez un projet hybride, le protocole dans Swift et l'affectation dans Objective-C:

Déclaration rapide:

protocol BackgroundTasking {
    func beginTask(withName: String, expirationHandler handler: (()->Void)?)
    func endTask(withName: String)
}

Mission Objective-C:

@property (nonatomic) id<BackgroundTasking> backgroundTasker;

_backgroundTasker = [[BackgroundTasker alloc] init]; // WARNING

Assignation à '__strong id' du type incompatible 'BackgroundTasker *')

Vous devez déclarer la classe (pour supprimer cet avertissement) et les fonctions (pour les rendre accessibles) en tant que @ objc pour qu'elles soient correctement pontées.

Corrigez la déclaration Swift:

@objc protocol BackgroundTasking {
    @objc func beginTask(withName: String, expirationHandler handler: (()->Void)?)
    @objc func endTask(withName: String)
}
0
bshirley