Gán cho 'id <Delegate>' từ loại không tương thích 'ViewController * const_strong'


84

Trong suốt ứng dụng của mình, tôi nhận được cảnh báo về vấn đề ngữ nghĩa khi tôi đặt ViewController.delegate = self. Tôi đã tìm kiếm và tìm thấy các bài viết tương tự nhưng không có bài nào có thể giải quyết được vấn đề của tôi.

ViewController.m:

GameAddViewController *gameAddViewContoller = [[navigationController viewControllers] objectAtIndex:0];
gameAddViewContoller.delegate=self;

Tôi nhận được thông báo lỗi khi cài đặt .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

Bất cứ ai có thể chỉ cho tôi đúng hướng để giải quyết các thông báo cảnh báo?

Câu trả lời:


80

Tại dòng này:

gameAddViewContoller.delegate=self; 

Lưu ý rằng bản thân thuộc loại ViewControllerKHÔNG phù hợp với GameAddViewControllergiao thức.


1
Tôi cần làm gì để sửa lỗi này. Có điều gì tôi cần thay đổi trong giao thức GameAddViewController không?
David L

2
Vì vậy, hãy làm như @borrrden đã đề xuất. Chỉnh ViewControllersửa thành GameAddViewControllerDelegate đại biểu.
giorashc

35
OK, vậy là cuối cùng tôi đã hiểu. Tôi đã thêm tệp này vào tệp tiêu đề của mình // # import "GameAddViewController.h" @interface ViewController: UIViewController <GameAddViewControllerDelegate> @ end //
David L Ngày

2
Hoặc, điều này có thể giúp đỡ người khác với vấn đề tương tự: @ interface myViewControllerName: UIViewController <MCSessionDelegate>
Tuỳ chỉnh Bonbons

2
Làm thế nào điều này được chấp nhận và 72 phiếu bầu? Câu trả lời này chỉ gợi lại cảnh báo của XCode và không cung cấp giải pháp.
SimpleJ

64

Đối với tôi, điều cuối cùng đã xảy ra là tôi đã không thêm đại biểu vào @interface trên tệp tiêu đề của mình

Ví dụ

@interface TheNameOfYourClass : UIViewController <TheDelegatorClassDelegate>

@end

12

Bạn đang đặt <GameAddViewControllerDelegate> không đúng chỗ. Nó không chạy trên GameAddViewController, nó chạy trên ViewController.


3

Điều này có thể giúp những người khác đang thêm Kết nối đa tốc độ vào ViewController. Ở đầu myViewControllerName.h, hãy thêm '<MCSessionDelegate>':

@interface myViewControllerName : UIViewController<MCSessionDelegate>

1

ngoài ra, nếu bạn xác định đại biểu của mình trên xx.m, nhưng bạn sử dụng nó trong lớp khác. bạn có thể gặp vấn đề này. vì vậy, chỉ cần đặt giao thức xác định trên xx.h, khi nó cần thiết.


1

Nếu bạn có một dự án kết hợp, giao thức trong Swift và nhiệm vụ trong Objective-C:

Khai báo nhanh chóng:

protocol BackgroundTasking {
    func beginTask(withName: String, expirationHandler handler: (()->Void)?)
    func endTask(withName: String)
}

Nhiệm vụ Objective-C:

@property (nonatomic) id<BackgroundTasking> backgroundTasker;

_backgroundTasker = [[BackgroundTasker alloc] init]; // WARNING

Gán cho '__strong id' từ loại không tương thích 'BackgroundTasker *'

Bạn cần khai báo lớp (để loại bỏ cảnh báo này) và các hàm (để làm cho chúng có thể truy cập được) dưới dạng @objc để chúng được bắc cầu chính xác.

Khai báo Swift đúng:

@objc protocol BackgroundTasking {
    @objc func beginTask(withName: String, expirationHandler handler: (()->Void)?)
    @objc func endTask(withName: String)
}

0

Trên các dự án kết hợp, bạn nên thêm người đại diện của mình trên tệp .h thay vì tệp .m

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.