13

我先声明了一个协议,然后使用它。但我收到警告“找不到 LeveyPopListViewDelegate 的协议定义”。这是代码:

@protocol LeveyPopListViewDelegate;

@interface LeveyPopListView : UIView <LeveyPopListViewDelegate,UITableViewDataSource,   UITableViewDelegate,UITextFieldDelegate>

//the content of LeveyPopListView

@end

@protocol LeveyPopListViewDelegate <NSObject>
//the definition for LeveyPopListViewDelegate
@end

如果我LeveyPopListViewDelegate首先定义,我不能LeveyPopListView在协议中使用。

4

7 回答 7

15

我最终抑制了该特定行的所有警告,这并不理想但效果很好。

// Forward-declare protocols (to avoid circular inclusion)
@protocol YourProtocol;
#pragma clang diagnostic push
// To get rid of 'No protocol definition found' warnings which are not accurate
#pragma clang diagnostic ignored "-Weverything" 

@interface YourClass: NSObject
// <YourProtocol>
#pragma clang diagnostic pop

确保您执行 push & pop,否则您最终会忽略此文件的所有警告!

于 2017-04-25T21:41:48.580 回答
2

如果您遵循了这篇文章中的好建议,但仍然遇到问题,请尝试进行清洁。我在它上面挠了一阵子,然后清理解决了这个问题。

于 2013-10-08T16:39:29.153 回答
1

我总是这样做:

@class LeveyPopListView;

@protocol LeveyPopListViewDelegate <NSObject>
//the definition for LeveyPopListViewDelegate
@end

@interface LeveyPopListView : UIView <LeveyPopListViewDelegate,UITableViewDataSource,   UITableViewDelegate,UITextFieldDelegate>

//the content of LeveyPopListView

@end
于 2013-02-21T01:57:08.170 回答
1

此外,如果您在不同的文件中声明和定义协议,则必须使用#import该文件,在这种情况下,前向声明将无济于事。

顺便提一句。永远不要像某些答案所暗示的那样抑制警告。

于 2018-12-20T08:54:40.523 回答
0

在协议定义中使用具体的类名是不寻常的。您应该做的(大多数情况下,可能会出现异常……尽管它们很臭)是使您的类符合协议,并在委托协议定义中使用该类。

一个类需要成为它自己的代表也是一种不好的气味。我会仔细修改设计。

于 2015-06-05T13:50:07.687 回答
0

当我将Swift协议导入Objective C课堂时,这发生在我身上。对我有帮助的是将*-Swift.h文件添加到Objective C类文件中:

#import "MyApp-Swift.h"

并将协议声明为@objc

@objc protocol VerificationGate
于 2018-12-06T18:31:57.487 回答
-1

您必须先定义协议。尝试如下

@protocol LeveyPopListViewDelegate <NSObject>
//the definition for LeveyPopListViewDelegate
@end

@interface LeveyPopListView : UIView <LeveyPopListViewDelegate,UITableViewDataSource,   UITableViewDelegate,UITextFieldDelegate>

//the content of LeveyPopListView

@end
于 2013-02-21T01:58:52.293 回答