我是Cocoa的新手,只需在Windows上使用C / C ++开发一些小应用程序。 我想在Cocoa上制作一个“简单”的应用程序。 当用户特定的XML文件时,文件节点表示“最终用户可查看”。
我与一些NSTextField建立了一个接口。 我创建了一个名为“XMLFile”的NSDocument子类,所以我在Xcode项目中得到了“XMLFile.h”和“XMLFile.m”。
在我的应用程序的plist中,我设置了一个新的“文档类型”: XML文件 - 扩展:xml - 角色:视图 - 类:XMLFile - 商店类型:XML
这是我的“XMLFile.h”:
#import <Cocoa/Cocoa.h>
@interface FichierXML : NSDocument {
}
IBOutlet NSTextField *dateField;
IBOutlet NSTextField *titleField;
IBOutlet NSTextField *descField;
IBOutlet NSTextField *vidfileField;
IBOutlet NSTextField *imgfileField;
IBOutlet NSObjectController *object;
NSUInteger *mask;
@end
这是我的“XMLFile.m”:
#import "XMLFile.h"
@implementation XMLFile
- (BOOL)readFromData:(NSData *)datafile ofType:(NSString *)typeName error:(NSError **)outerror
{
NSMutableArray* ReportCreationDate = [[NSMutableArray alloc] initWithCapacity:10];
NSMutableArray* ReportTitle = [[NSMutableArray alloc] initWithCapacity:10];
NSMutableArray* ReportDescription = [[NSMutableArray alloc] initWithCapacity:10];
NSMutableArray* VideoPath = [[NSMutableArray alloc] initWithCapacity:10];
NSMutableArray* VideoThumbnailImageName = [[NSMutableArray alloc] initWithCapacity:10];
NSXMLDocument* doc = [[NSXMLDocument alloc] initWithData:datafile options:mask error:outerror];
NSXMLElement* root = [doc rootElement];
NSArray* dateElement = [root nodesForXPath:@"//Report/ReportCreationDate" error:nil];
for(NSXMLElement* xmlElement in dateElement)
[dateElement setStringValue:[xmlElement stringValue]];
NSArray* titleElement = [root nodesForXPath:@"//Report/ReportTitle" error:nil];
for(NSXMLElement* xmlElement in titleElement)
[titleField setStringValue:[xmlElement stringValue]];
NSArray* descElement = [root nodesForXPath:@"//Report/ReportDescription" error:nil];
for(NSXMLElement* xmlElement in descElement)
[descField setStringValue:[xmlElement stringValue]];
NSArray* vidfileElement = [root nodesForXPath:@"//Report/Videos/Video/VideoPath" error:nil];
for(NSXMLElement* xmlElement in vidfileElement)
[vidfileField setStringValue:[xmlElement stringValue]];
NSArray* imgfileElement = [root nodesForXPath:@"//Report/Videos/Video/VideoThumbnailImageName" error:nil];
for(NSXMLElement* xmlElement in imgfileElement)
[imgfileField setStringValue:[xmlElement stringValue]];
[doc release];
[ReportCreationDate release];
[ReportTitle release];
[ReportDescription release];
[VideoPath release];
[VideoThumbnailImageName release];
return YES;
}
@end
用户打开XMLFile,XMLDocument分析文件以提取节点的数据并将其发送到不同的NSTextField。但它不起作用。
如果有人可以帮助我。
答案 0 :(得分:1)
你对于什么不起作用并不是太具体,但是在某些可能导致麻烦的事情中,这是一两个猜测......
作为新的Cocoa用户,很容易忘记的一件事是IBOutlets必须实际连接到Interface Builder中。控制 - 从Document.xib中的每个文本字段拖动到文件的所有者,并确保将它们分配到正确的插座。
另一个看似奇怪的项目(虽然我不确定它会导致问题)是您使用for
循环来设置文本字段的stringValue
。如果每个元素的数组中有多个项目,则需要在设置文本字段的值之前自己连接字符串。重复设置该值将简单地除去先前的值。如果每个数组中只有一个项目,为什么不简单地执行:
NSArray *dateElement = [root
nodesForXPath:@"//Report/ReportCreationDate"
error:nil];
[dateField setStringValue:
[[dateElement objectAtIndex:0] stringValue]];
最后,您可能想要在查询NSXMLDocument时尝试确保没有错误:
NSError *dateErr;
NSArray *dateElement = [root
nodesForXPath:@"//Report/ReportCreationDate"
error:&dateErr];
if( dateElement ){
// set the stringValue
}
else {
// inspect the error
}