Присвоєння '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>
Спеціальні бонбони

2
Як це було прийнято та отримано 72 голоси? Ця відповідь просто переформулює попередження XCode і не дає жодного рішення.
SimpleJ

64

Для мене все закінчилося тим, що я не додав делегата до @interface у своєму заголовковому файлі

Наприклад

@interface TheNameOfYourClass : UIViewController <TheDelegatorClassDelegate>

@end

12

Ви ставите <GameAddViewControllerDelegate> в неправильному місці. Це не йде на GameAddViewController, воно йде на ViewController.


3

Це може допомогти іншим людям, які додають багаторівневе підключення прямо до 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)
}

Завдання C-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.