Zuweisen zu 'id <Delegate>' vom inkompatiblen Typ 'ViewController * const_strong'

84

Während meiner App erhalte ich beim Festlegen Warnungen vor semantischen Problemen ViewController.delegate = self. Ich habe ähnliche Beiträge gesucht und gefunden, aber keiner konnte mein Problem lösen.

ViewController.m:

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

Ich erhalte die Fehlermeldung beim Einstellen .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

Kann mich jemand in die richtige Richtung weisen, um die Warnmeldungen zu beheben?

David L.
quelle

Antworten:

80

In dieser Zeile:

gameAddViewContoller.delegate=self; 

Beachten Sie, dass self vom Typ ist, ViewControllerder NICHT dem GameAddViewControllerProtokoll entspricht.

giorashc
quelle
1
Was muss ich tun, um dies zu beheben? Muss ich im GameAddViewController-Protokoll etwas ändern?
David L
2
Machen Sie es wie von @borrrden vorgeschlagen. Passen Sie das ViewControlleran den GameAddViewControllerDelegate Delegierten an.
Giorashc
35
OK, also habe ich es endlich verstanden. Ich habe dies zu meiner Header-Datei hinzugefügt // # import "GameAddViewController.h" @interface ViewController: UIViewController <GameAddViewControllerDelegate> @ end //
David L
2
Oder dies könnte anderen Menschen mit ähnlichen Problemen helfen: @interface myViewControllerName: UIViewController <MCSessionDelegate>
Benutzerdefinierte Bonbons
2
Wie wurde dies akzeptiert und 72 Stimmen? Diese Antwort formuliert nur die Warnung von XCode neu und bietet keine Lösung.
SimpleJ
64

Für mich war es am Ende so, dass ich den Delegaten nicht zur @ Schnittstelle in meiner Header-Datei hinzugefügt habe

Zum Beispiel

@interface TheNameOfYourClass : UIViewController <TheDelegatorClassDelegate>

@end
Raul Lopez
quelle
12

Sie platzieren das <GameAddViewControllerDelegate> an der falschen Stelle. Es geht nicht auf GameAddViewController, sondern auf ViewController.

borrrden
quelle
3

Dies kann anderen Personen helfen, die Multipeer Connectivity direkt zu einem ViewController hinzufügen. Fügen Sie oben in myViewControllerName.h '<MCSessionDelegate>' hinzu:

@interface myViewControllerName : UIViewController<MCSessionDelegate>
Kundenspezifische Bonbons
quelle
1

auch, wenn Sie Ihren Delegaten auf xx.m definieren, ihn aber in einer anderen Klasse verwenden. Sie können dieses Problem bekommen. Setzen Sie also einfach das Protokoll define auf xx.h, wenn es benötigt wird.

Michael Tangs
quelle
1

Wenn Sie ein Hybridprojekt haben, das Protokoll in Swift und die Zuweisung in Objective-C:

Schnelle Erklärung:

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

Ziel-C-Aufgabe:

@property (nonatomic) id<BackgroundTasking> backgroundTasker;

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

Zuweisen zu '__strong id' vom inkompatiblen Typ 'BackgroundTasker *'

Sie müssen die Klasse (um diese Warnung zu entfernen) und die Funktionen (um sie zugänglich zu machen) als @objc deklarieren, damit sie korrekt überbrückt werden.

Richtige Swift-Erklärung:

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

Bei Hybridprojekten sollten Sie Ihre Delegaten in der .h-Datei anstelle der .m-Datei hinzufügen

oskarko
quelle