アプリ全体で、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で行われます。
これは、Multipeer ConnectivityをViewControllerに直接追加している他の人々を助けるかもしれません。 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)
}