从不兼容类型'ViewController * const_strong'</delegate>分配给'id <delegate>'

时间:2012-03-25 15:52:29

标签: ios objective-c delegates

在我的应用程序中,当我设置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

有人能指出我正确的方向来解决警告信息吗?

7 个答案:

答案 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)
}