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

35
OK、それで私はついにそれを手に入れました。これをヘッダーファイルに追加しました//#import "GameAddViewController.h" @interface ViewController:UIViewController <GameAddViewControllerDelegate> @ end //
David L

2
または、これは同様の問題を抱えている他の人々を助けるかもしれません:@interface myViewControllerName:UIViewController <MCSessionDelegate>
カスタムボンボン

2
これはどのようにして受け入れられ、72票を獲得しましたか?この回答は、XCodeの警告を言い換えるだけであり、解決策はありません。
simpleJ 2018

64

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

例えば

@interface TheNameOfYourClass : UIViewController <TheDelegatorClassDelegate>

@end

12

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


3

これは、MultipeerConnectivityをViewControllerに直接追加している他の人に役立つ可能性があります。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 *」から「__strongid」に割り当てます

クラス(この警告を削除するため)と関数(アクセス可能にするため)を@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.