2011-03-10 9 views
2

저는 Cocoa의 초보자입니다. Windows에서 C/C++로 몇 가지 작은 앱을 개발하십시오. Cocoa에서 "간단한"앱을 만들고 싶습니다. 사용자 특정 XML 파일의 경우 파일 노드는 "최종 사용자가 볼 수 있음"으로 표시됩니다.코코아 XML 리더 앱

일부 NSTextField와 인터페이스를 만들었습니다. Xcode 프로젝트에서 "XMLFile.h"와 "XMLFile.m"을 얻을 수 있도록 "XMLFile"이라는 NSDocument 하위 클래스를 만들었습니다. 확장 - XML 파일 : XML - 역할 :보기 - 클래스 : XMLFILE - 저장소 유형 : XML 여기

내 "XMLFILE이 나는 새로운"문서 유형 "을 설정 내 응용 프로그램의 PLIST에서

. H : XMLFile.m ""여기

#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 

그리고 내이다 ​​"

#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는 노드의 데이터를 추출 할 파일을 분석하고 D로 전송 ifferents NSTextField. 그러나 그것은 효과가 없습니다.

누군가 나를 도울 수 있다면.

답변

1

당신은 작동하지 않는 것에 대해 너무 특정하지 않은, 그러나 여기 추측 또는 문제가 원인이 될 수있는 몇 가지에서 두 가지의 ...

쉽게 할 수 있습니다

한 가지 새로운 코코아로 잊지 사용자는 IBOutlets가 실제로 Interface Builder에 연결되어야한다는 것입니다. Document.xib의 각 텍스트 필드에서 File 's Owner로 Control 키를 누른 상태에서 올바른 콘센트에 지정되었는지 확인하십시오.

이상하게 보이는 또 다른 항목 (나는 확실히 문제가 될지 모르지만)은 for 루프를 사용하여 텍스트 필드의 stringValue을 설정합니다. 각 요소의 배열에 항목이 두 개 이상있는 경우 텍스트 필드의 값을 설정하기 전에 문자열을 직접 연결해야합니다. 반복적으로 값을 설정하면 이전 값을 제거하게됩니다. 하나의 항목 만이 각각의 배열이 있다면, 왜 간단하지 :

NSError *dateErr; 
NSArray *dateElement = [root 
       nodesForXPath:@"//Report/ReportCreationDate" 
         error:&dateErr]; 
if(dateElement){ 
    // set the stringValue 
} 
else { 
    // inspect the error 
} 
+0

지금 :

NSArray *dateElement = [root nodesForXPath:@"//Report/ReportCreationDate" error:nil]; [dateField setStringValue: [[dateElement objectAtIndex:0] stringValue]]; 

마지막으로, 당신이 만드는 시도 할 수도 있는지 당신이 NSXMLDocument 조회하고 오류가 없습니다 너는 특권이있다. ;) –

+0

@sudo rm -rf 안녕하세요, upvote 주셔서 감사합니다! (나는 아직도 "사방 코멘트"에 대한 담당자에게 조금 부족한 것 같다.) –

+0

아, 잘 생각해 보니, 20이라고 생각했습니다. 계속해라! :디 –