Назначение 'id <Delegate>' из несовместимого типа 'ViewController * const_strong'

В моем приложении у меня возникают семантические предупреждения о проблемах, когда я устанавливаю ViewController.delegate = self. Я искал и нашел похожие сообщения, но никто не смог решить мою проблему.

ViewController.m:

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

Я получаю сообщение об ошибке при установке .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

Может ли кто-нибудь указать мне в правильном направлении для устранения предупреждающих сообщений?

Ответ 1

В этой строке:

gameAddViewContoller.delegate=self; 

Обратите внимание, что self имеет тип ViewController, который НЕ соответствует протоколу GameAddViewController.

Ответ 2

Для меня случилось то, что я не добавлял делегата в @interface в мой заголовочный файл

Например

@interface TheNameOfYourClass : UIViewController <TheDelegatorClassDelegate>

@end

Ответ 3

Вы помещаете <GameAddViewControllerDelegate> в неправильном месте. Он не идет на GameAddViewController, он идет на ViewController.

Ответ 4

Это может помочь другим людям, добавляющим Multipeer Connectivity прямо в ViewController. В верхней части myViewControllerName.h добавьте '<MCSessionDelegate> ':

@interface myViewControllerName : UIViewController<MCSessionDelegate>

Ответ 5

также, если вы определяете своего делегата на xx.m, но используете его в другом классе. вы можете получить эту проблему. поэтому просто установите протокол define на xx.h, когда это необходимо.

Ответ 6

В гибридных проектах вы должны добавить своих делегатов в файл .h вместо файла .m

Ответ 7

Если у вас есть гибридный проект, протокол в Swift и назначение в Objective-C:

Свифт декларация:

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

Назначение Objective-C:

@property (nonatomic) id<BackgroundTasking> backgroundTasker;

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

Присвоение __strong id из несовместимого типа BackgroundTasker *

Вам нужно объявить класс (чтобы удалить это предупреждение) и функции (чтобы сделать их доступными) как @objc, чтобы они были правильно соединены.

Правильная декларация Swift:

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