web-dev-qa-db-ja.com

互換性のないタイプ「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

警告メッセージを解決するために誰かが私を正しい方向に向けることができますか?

77
David L

この行で:

gameAddViewContoller.delegate=self; 

SelfはViewControllerプロトコルに準拠しないタイプGameAddViewControllerであることに注意してください。

77
giorashc

私にとっては、ヘッダーファイルの@interfaceにデリゲートを追加していなかったということです

例えば

@interface TheNameOfYourClass : UIViewController <TheDelegatorClassDelegate>

@end

<GameAddViewControllerDelegate>を間違った場所に配置しています。 GameAddViewControllerではなく、ViewControllerで行われます。

12
borrrden

これは、Multipeer ConnectivityをViewControllerに直接追加している他の人々を助けるかもしれません。 myViewControllerName.hの上部に「<MCSessionDelegate>」を追加します。

@interface myViewControllerName : UIViewController<MCSessionDelegate>
3
Custom Bonbons

また、xx.mでデリゲートを定義しているが、それを他のクラスで使用している場合。この問題が発生する可能性があります。そのため、必要な場合はxx.hにプロトコル定義を置くだけです。

1
Michael Tangs

ハイブリッドプロジェクトでは、.mファイルの代わりに.hファイルにデリゲートを追加する必要があります

0
oskarko

ハイブリッドプロジェクトがある場合、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
bshirley