호환되지 않는 유형 'ViewController * const_strong'에서 'id <Delegate>'에 할당


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 프로토콜에서 변경해야 할 사항이 있습니까?
David L

2
@borrrden이 제안한대로 수행하십시오. 대리자 ViewController에게 따르십시오 GameAddViewControllerDelegate.
giorashc

35
좋아, 마침내 얻었습니다. UIViewController에 <GameAddViewControllerDelegate> @ 끝 // : 나는의 ViewController @interface 내 헤더 파일 // # 가져 오기 "GameAddViewController.h"이 추가
데이비드 L

2
또는,이 힘의 도움 비슷한 문제를 가진 다른 사람 : @ 인터페이스의 myViewControllerName : UIViewController에 <MCSessionDelegate>
사용자 정의 봉봉

2
어떻게 수락되고 72 표를 얻었습니까? 이 답변은 XCode의 경고를 바꾸고 해결책을 제공하지 않습니다.
SimpleJ

64

나에게 일어난 일은 헤더 파일의 @interface에 대리인을 추가하지 않았다는 것입니다.

예를 들면

@interface TheNameOfYourClass : UIViewController <TheDelegatorClassDelegate>

@end

12

<GameAddViewControllerDelegate>를 잘못된 위치에 놓았습니다. GameAddViewController로 이동하지 않고 ViewController로 이동합니다.


3

이것은 ViewController에 직접 Multipeer Connectivity를 추가하는 다른 사람들에게 도움이 될 수 있습니다. 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

호환되지 않는 유형 'BackgroundTasker *'에서 '__strong id'에 할당

클래스 (이 경고를 제거하기 위해)와 함수 (액세스 할 수 있도록하기 위해)를 @objc선언 해야 올바르게 브리지됩니다.

올바른 Swift 선언 :

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

0

하이브리드 프로젝트에서는 .m 파일 대신 .h 파일에 대리인을 추가해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.