在我的应用程序中,当我设置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
有人能指出我正确的方向来解决警告信息吗?
答案 0 :(得分:77)
在这一行:
gameAddViewContoller.delegate=self;
请注意,self属于ViewController
类型,不符合GameAddViewController
协议。
答案 1 :(得分:59)
对我来说最终发生的事情是我没有将代理添加到我的头文件中的@interface
例如
@interface TheNameOfYourClass : UIViewController <TheDelegatorClassDelegate>
@end
答案 2 :(得分:12)
你正在把&lt; GameAddViewControllerDelegate&gt;在错误的地方。它不在GameAddViewController上,而是在ViewController上。
答案 3 :(得分:3)
这可能有助于将Multipeer Connectivity直接添加到ViewController的其他人。在myViewControllerName.h的顶部添加'&lt; MCSessionDelegate&gt;':
@interface myViewControllerName : UIViewController<MCSessionDelegate>
答案 4 :(得分:1)
另外,如果您在xx.m上定义了委托,但是在其他类中使用它。你可能会遇到这个问题。所以,只需在需要时将协议定义放在xx.h上。
答案 5 :(得分:0)
在混合项目中,您应该将代理添加到.h文件而不是.m文件
答案 6 :(得分:0)
如果您有一个混合项目,请使用Swift中的协议和Objective-C中的分配:
快速声明:
protocol BackgroundTasking {
func beginTask(withName: String, expirationHandler handler: (()->Void)?)
func endTask(withName: String)
}
目标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)
}