Przypisywanie do „id <Delegate>” z niezgodnego typu „ViewController * const_strong”

84

Po ustawieniu w mojej aplikacji otrzymuję semantyczne ostrzeżenia o problemach ViewController.delegate = self. Szukałem i znalazłem podobne posty, ale żaden nie był w stanie rozwiązać mojego problemu.

ViewController.m:

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

Otrzymuję komunikat o błędzie podczas ustawiania .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

Czy ktoś może wskazać mi właściwy kierunek rozwiązywania komunikatów ostrzegawczych?

David L.
źródło

Odpowiedzi:

81

W tej linii:

gameAddViewContoller.delegate=self; 

Zauważ, że self jest typu, ViewControllerktóry NIE jest zgodny z GameAddViewControllerprotokołem.

giorashc
źródło
1
Co muszę zrobić, aby to naprawić. Czy jest coś, co muszę zmienić w protokole GameAddViewController?
David L
2
Zrób więc zgodnie z sugestią @borrrden. Zgodność ViewControllerz GameAddViewControllerDelegate delegatem.
giorashc
35
OK, więc w końcu to zrozumiałem. Dodałem to do mojego pliku nagłówkowego // # import "GameAddViewController.h" @interface ViewController: UIViewController <GameAddViewControllerDelegate> @ end //
David L
2
Lub może to pomóc innym osobom z podobnymi problemami: @interface myViewControllerName: UIViewController <MCSessionDelegate>
Custom Bonbons
2
Jak to się przyjęło i otrzymało 72 głosy? Ta odpowiedź po prostu przepisuje ostrzeżenie XCode i nie zapewnia żadnego rozwiązania.
SimpleJ
64

Skończyło się na tym, że nie dodałem delegata do @interface w moim pliku nagłówkowym

Na przykład

@interface TheNameOfYourClass : UIViewController <TheDelegatorClassDelegate>

@end
Raul Lopez
źródło
12

Umieszczasz <GameAddViewControllerDelegate> w niewłaściwym miejscu. Nie trafia na GameAddViewController, ale na ViewController.

borrrden
źródło
3

Może to pomóc innym osobom, które dodają łączność Multipeer bezpośrednio do ViewController. W górnej części myViewControllerName.h dodaj „<MCSessionDelegate>”:

@interface myViewControllerName : UIViewController<MCSessionDelegate>
Niestandardowe cukierki
źródło
1

również, jeśli zdefiniujesz swojego delegata na xx.m, ale używasz go w innej klasie. możesz mieć ten problem. więc po prostu umieść definicję protokołu w xx.h, kiedy jest to potrzebne.

Michael Tangs
źródło
1

Jeśli masz projekt hybrydowy, protokół w Swift i przypisanie w Objective-C:

Szybka deklaracja:

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

Zadanie w ramach celu C:

@property (nonatomic) id<BackgroundTasking> backgroundTasker;

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

Przypisywanie do „__strong id” z niezgodnego typu „BackgroundTasker *”

Musisz zadeklarować klasę (aby usunąć to ostrzeżenie) i funkcje (aby były dostępne) jako @objc, aby zostały poprawnie zmostkowane.

Prawidłowa deklaracja Swift:

@objc protocol BackgroundTasking {
    @objc func beginTask(withName: String, expirationHandler handler: (()->Void)?)
    @objc func endTask(withName: String)
}
bshirley
źródło
0

W projektach hybrydowych powinieneś dodać swoich delegatów do pliku .h zamiast pliku .m

oskarko
źródło