[ios] 호환되지 않는 유형 ‘ViewController * const_strong’에서 ‘id <Delegate>’에 할당

내 앱 전체에서을 설정할 때 의미 론적 문제 경고가 표시됩니다 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

누구든지 경고 메시지를 해결하기 위해 올바른 방향을 알려줄 수 있습니까?



답변

이 줄에서 :

gameAddViewContoller.delegate=self;

self는 프로토콜을 ViewController따르지 않는 유형 입니다 GameAddViewController.


답변

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

예를 들면

@interface TheNameOfYourClass : UIViewController <TheDelegatorClassDelegate>

@end


답변

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


답변

이것은 ViewController에 직접 Multipeer Connectivity를 추가하는 다른 사람들에게 도움이 될 수 있습니다. myViewControllerName.h 맨 위에 ‘<MCSessionDelegate>’를 추가합니다.

@interface myViewControllerName : UIViewController<MCSessionDelegate>


답변

또한 xx.m에 대리자를 정의하지만 다른 클래스에서 사용하는 경우에도 마찬가지입니다. 이 문제가 발생할 수 있습니다. 따라서 필요할 때 프로토콜 정의를 xx.h에 넣으십시오.


답변

하이브리드 프로젝트가있는 경우 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)
}


답변

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