Assegnazione a "id <Delegate>" dal tipo incompatibile "ViewController * const_strong"


84

In tutta la mia app, ricevo avvisi di problemi semantici quando imposto ViewController.delegate = self. Ho cercato e trovato post simili ma nessuno è riuscito a risolvere il mio problema.

ViewController.m:

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

Ricevo il messaggio di errore durante l'impostazione .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

Qualcuno può indicarmi la giusta direzione per risolvere i messaggi di avviso?

Risposte:


80

A questa riga:

gameAddViewContoller.delegate=self; 

Notare che self è di tipo ViewControllerNON conforme al GameAddViewControllerprotocollo.


1
Cosa devo fare per risolvere questo problema. C'è qualcosa che devo cambiare nel protocollo GameAddViewController?
David L

2
Quindi fai come suggerito da @borrrden. Conforme ViewControlleral GameAddViewControllerDelegate delegato.
giorashc

35
OK, finalmente l'ho capito. Ho aggiunto questo al mio file di intestazione // # import "GameAddViewController.h" @interface ViewController: UIViewController <GameAddViewControllerDelegate> @ end //
David L

2
Oppure, questo potrebbe aiutare altre persone con problemi simili: @interface myViewControllerName: UIViewController <MCSessionDelegate>
Custom Bonbons

2
Come è stato accettato questo e 72 voti? Questa risposta si limita a riformulare l'avvertimento di XCode e non fornisce alcuna soluzione.
SimpleJ

63

Per me quello che è successo è che non stavo aggiungendo il delegato all'interfaccia @ sul mio file di intestazione

Per esempio

@interface TheNameOfYourClass : UIViewController <TheDelegatorClassDelegate>

@end

12

Stai mettendo <GameAddViewControllerDelegate> nel posto sbagliato. Non va su GameAddViewController, va su ViewController.


4

Questo potrebbe aiutare altre persone che stanno aggiungendo Multipeer Connectivity direttamente a un ViewController. Nella parte superiore di myViewControllerName.h aggiungi "<MCSessionDelegate>":

@interface myViewControllerName : UIViewController<MCSessionDelegate>

1

inoltre, se definisci il tuo delegato su xx.m, ma lo usi in un'altra classe. potresti avere questo problema. quindi, basta mettere protocol define su xx.h, quando è necessario.


1

Se hai un progetto ibrido, il protocollo in Swift e l'assegnazione in Objective-C:

Dichiarazione rapida:

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

Assegnazione Obiettivo C:

@property (nonatomic) id<BackgroundTasking> backgroundTasker;

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

Assegnazione a "__strong id" dal tipo incompatibile "BackgroundTasker *"

È necessario dichiarare la classe (per rimuovere questo avviso) e le funzioni (per renderle accessibili) come @objc affinché siano correttamente collegate.

Dichiarazione Swift corretta:

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

0

Nei progetti ibridi è necessario aggiungere i delegati al file .h anziché al file .m

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.