programing

'id에 할당

nasanasas 2020. 10. 14. 07:54
반응형

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


내 앱 전체에서을 설정하면 의미 론적 문제 경고가 표시됩니다 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에 넣으십시오.


하이브리드 프로젝트에서는 .m 파일 대신 .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)
}

참고URL : https://stackoverflow.com/questions/9861538/assigning-to-iddelegate-from-incompatible-type-viewcontroller-const-strong

반응형