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?

Antworten:


80

In dieser Zeile:

gameAddViewContoller.delegate=self; 

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


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

12

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


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>

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.


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

0

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.