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


84

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

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

Ответы:


80

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

gameAddViewContoller.delegate=self; 

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


1
Что мне нужно сделать, чтобы это исправить. Мне нужно что-то изменить в протоколе GameAddViewController?
Дэвид Л.

2
Так что сделайте, как предложил @borrrden. Соответствуют ViewControllerк GameAddViewControllerDelegate делегату.
giorashc

35
Хорошо, наконец-то я понял. Я добавил это в свой заголовочный файл // # import "GameAddViewController.h" @interface ViewController: UIViewController <GameAddViewControllerDelegate> @ end //
Дэвид Л.

2
Или это может помочь другим людям с аналогичными проблемами: @interface myViewControllerName: UIViewController <MCSessionDelegate>
Custom Bonbons

2
Как это было принято и 72 голоса? Этот ответ просто перефразирует предупреждение XCode и не предлагает решения.
SimpleJ 08

63

Для меня в конечном итоге произошло то, что я не добавлял делегата к @interface в моем файле заголовка.

Например

@interface TheNameOfYourClass : UIViewController <TheDelegatorClassDelegate>

@end

12

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


4

Это может помочь другим людям, которые добавляют многопользовательское соединение прямо в ViewController. Вверху myViewControllerName.h добавьте «<MCSessionDelegate>»:

@interface myViewControllerName : UIViewController<MCSessionDelegate>

1

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


1

Если у вас гибридный проект, протокол в 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)
}

0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.