Присвоение 'id <Delegate>' несовместимого типа 'ViewController * const_strong' - PullRequest
77 голосов
/ 25 марта 2012

Во всем приложении я получаю предупреждения о семантических проблемах при установке 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

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

Ответы [ 7 ]

77 голосов
/ 25 марта 2012

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

gameAddViewContoller.delegate=self; 

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

60 голосов
/ 17 октября 2013

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

Например

@interface TheNameOfYourClass : UIViewController <TheDelegatorClassDelegate>

@end
12 голосов
/ 25 марта 2012

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

3 голосов
/ 28 июля 2014

Это может помочь другим людям, которые добавляют Multipeer Connectivity прямо в ViewController. Вверху myViewControllerName.h добавьте '':

@interface myViewControllerName : UIViewController<MCSessionDelegate>
1 голос
/ 13 февраля 2017

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

0 голосов
/ 17 июля 2019

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

Объявление Swift:

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)
}
0 голосов
/ 01 февраля 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...