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 ユーザーとして忘れがちなことの 1 つは、IBOutlets を実際に Interface Builder に接続する必要があることです。Control キーを押しながら各テキスト フィールドから Document.xib の File's Owner にドラッグし、それらが正しいアウトレットに割り当てられていることを確認します。

奇妙に思えるもう 1 つの項目 (問題が発生するかどうかはわかりませんが) は、forループを使用stringValueしてテキスト フィールドの を設定することです。各要素の配列に複数のアイテムがある場合は、テキスト フィールドの値を設定する前に、文字列を自分で連結する必要があります。値を繰り返し設定すると、以前の値が取り除かれます。各配列にアイテムが1つしかない場合は、単純に次のようにしないでください:

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 に答える