2

我是 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。但它不起作用。

如果有人可以帮助我。

4

1 回答 1

1

你对什么不起作用并不太具体,但这里有一些可能引起麻烦的事情的一两个猜测......

作为一个新的 Cocoa 用户很容易忘记的一件事是 IBOutlets 必须实际连接到 Interface Builder 中。按住 Control 从每个文本字段拖动到 Document.xib 中的 File's Owner,并确保将它们分配到正确的出口。

另一个看起来很奇怪的项目(虽然我不确定它是否会导致问题)是您使用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
}
于 2011-03-10T21:27:47.533 回答