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?

Respuestas:


80

En esta línea:

gameAddViewContoller.delegate=self; 

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


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

12

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


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>

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.


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)
}

0

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.