내 앱 전체에서을 설정할 때 의미 론적 문제 경고가 표시됩니다 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 파일에 대리인을 추가해야합니다.