从不兼容的类型'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

谁能指出正确的方向来解决警告消息?

Answers:


80

在这一行:

gameAddViewContoller.delegate=self; 

请注意,self是ViewController不符合GameAddViewController协议的类型。


1
我需要怎么做才能解决此问题。我需要在GameAddViewController协议中进行更改吗?
David L

2
按照@borrrden的建议进行操作。顺应了ViewControllerGameAddViewControllerDelegate 委托。
giorashc 2012年

35
好的,所以我终于明白了。我将此添加到我的头文件中// // import“ GameAddViewController.h” @interface ViewController:UIViewController <GameAddViewControllerDelegate> @ end //
David L

2
或者,这可能会帮助遇到类似问题的其他人:@interface myViewControllerName:UIViewController <MCSessionDelegate>
自定义糖果

2
这是如何被接受并获得72票的?这个答案只是改写XCode的警告,没有提供解决方案。
SimpleJ

64

对我来说,最终发生的事情是我没有将委托添加到头文件的@interface上

例如

@interface TheNameOfYourClass : UIViewController <TheDelegatorClassDelegate>

@end

12

您将<GameAddViewControllerDelegate>放在错误的位置。它不会在GameAddViewController上运行,而会在ViewController上运行。


3

这可能会帮助将Multipeer Connectivity直接添加到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)
}

目标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

在混合项目中,您应该在.h文件而不是.m文件上添加代理

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.