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?
A cette ligne:
gameAddViewContoller.delegate=self;
Notez que self est du type ViewController
qui ne respecte PAS le protocole GameAddViewController
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
Vous mettez le <GameAddViewControllerDelegate> au mauvais endroit. Il ne va pas sur GameAddViewController, mais sur ViewController.
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>
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.
Sur les projets hybrides, vous devez ajouter vos délégués au fichier .h au lieu du fichier .m
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)
}