我的头文件定义如下:
#import <Foundation/Foundation.h>
@interface Warning: NSObject {
Run Code Online (Sandbox Code Playgroud)
在我的.m文件中,我做:
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
[parser setDelegate:self];
Run Code Online (Sandbox Code Playgroud)
这编译并在3.0下正常工作.
如果我尝试使用4.0编译,我会收到此错误:
没有实现'NSXMLParserDelegate'协议
如果我添加:
@interface Warning: NSObject <NSXMLParserDelegate> {
Run Code Online (Sandbox Code Playgroud)
它用4.0编译好,但是当我尝试用3.0编译时,我得到:
错误:找不到'NSXMLParserDelegate'的协议声明
基础框架正确找到.添加NSXMLParser.h没有帮助.
任何帮助,将不胜感激.
谢谢
根据库参考文档, NSXMLParser 不需要严格的 NSXMLParserDelegate 实现:
- (void)setDelegate:(id)delegate
- (id)delegate
Run Code Online (Sandbox Code Playgroud)
NSXMLParser 动态检查所需委托方法的可用性。
如果 NSXMLParser 需要 NSXMLParserDelegate 完整实现,则访问器将是:
- (void)setDelegate:(id<NSXMLParserDelegate>)delegate
- (id<NSXMLParserDelegate>)delegate
Run Code Online (Sandbox Code Playgroud)
我想这就是为什么框架中没有实际定义 NSXMLParserDelegate 协议的原因。
所以,这个界面对我来说似乎是正确的:
#import <Foundation/Foundation.h>
@interface Warning: NSObject {
Run Code Online (Sandbox Code Playgroud)
您所要做的就是实现您需要的委托方法。
编辑 :
您可以尝试使用预处理器宏来激活或停用协议使用声明:
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0
@interface Warning: NSObject <NSXMLParserDelegate>
#else
@interface Warning: NSObject
#endif
{
// interface definition ...
Run Code Online (Sandbox Code Playgroud)
我没有在 4.0 上尝试过这个,但它在 3.1 和 3.2 之间的另一个例子上有效