Asignar a 'id <Delegate>' del tipo incompatible 'ViewController * const_strong'

84

En toda mi aplicación, recibo advertencias de problemas semánticos cuando configuro ViewController.delegate = self. He buscado y encontrado publicaciones similares, pero ninguna pudo resolver mi problema.

ViewController.m:

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

Recibo el mensaje de error al configurar .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

¿Alguien puede indicarme la dirección correcta para resolver los mensajes de advertencia?

David L
fuente

Respuestas:

80

En esta línea:

gameAddViewContoller.delegate=self; 

Tenga en cuenta que self es de un tipo ViewControllerque NO se ajusta al GameAddViewControllerprotocolo.

giorashc
fuente
1
¿Qué debo hacer para solucionar este problema? ¿Hay algo que deba cambiar en el protocolo GameAddViewController?
David L
2
Así que haz lo que sugirió @borrrden. Conforme ViewControlleral GameAddViewControllerDelegate delegado.
giorashc
35
Bien, finalmente lo entendí. Agregué esto a mi archivo de encabezado // # import "GameAddViewController.h" @interface ViewController: UIViewController <GameAddViewControllerDelegate> @ end //
David L
2
O, esto podría ayudar a otras personas con problemas similares: @interface myViewControllerName: UIViewController <MCSessionDelegate>
Custom Bonbons
2
¿Cómo fue aceptado y con 72 votos? Esta respuesta simplemente reformula la advertencia de XCode y no proporciona ninguna solución.
SimpleJ
64

Para mí, lo que terminó sucediendo es que no estaba agregando el delegado a la @interface en mi archivo de encabezado

Por ejemplo

@interface TheNameOfYourClass : UIViewController <TheDelegatorClassDelegate>

@end
Raul lopez
fuente
12

Está poniendo <GameAddViewControllerDelegate> en el lugar equivocado. No va a GameAddViewController, va a ViewController.

borrrden
fuente
3

Esto podría ayudar a otras personas que están agregando conectividad multipeer directamente a un ViewController. En la parte superior de myViewControllerName.h agregue '<MCSessionDelegate>':

@interface myViewControllerName : UIViewController<MCSessionDelegate>
Bombones personalizados
fuente
1

también, si define su delegado en xx.m, pero lo usa en otra clase. puede tener este problema. por lo tanto, simplemente coloque la definición de protocolo en xx.h, cuando sea necesario.

Michael Tangs
fuente
1

Si tiene un proyecto híbrido, el protocolo en Swift y la asignación en Objective-C:

Declaración rápida:

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

Asignación de Objective-C:

@property (nonatomic) id<BackgroundTasking> backgroundTasker;

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

Asignar a '__ strong id' del tipo incompatible 'BackgroundTasker *'

Debe declarar la clase (para eliminar esta advertencia) y las funciones (para hacerlas accesibles) como @objc para que estén correctamente puenteadas.

Declaración correcta de Swift:

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

En proyectos híbridos, debe agregar sus delegados en el archivo .h en lugar del archivo .m

oskarko
fuente