0

オンライン XML ファイルから情報を取得するために NSXMLParser を使用しています。私の目標は、1 つのクラスで XML 解析を行い、別のクラスで変数を実装することです。以下は私のプロジェクトのコードです:

Current.h & Current.m

#import <Foundation/Foundation.h>

@interface Current : NSObject {
    NSString *curTempF;
    IBOutlet NSTextField *textField;
}

@property (nonatomic, copy) NSString *curTempF;

- (void)displayOutlets:(id)sender;

@end

#import "Current.h"

@implementation Current

@synthesize curTempF;

- (void)awakeFromNib {
    [self displayOutlets:self];
}

- (void)displayOutlets:(id)sender {
    [textField setStringValue:curTempF];
}

@end

XmlParser.h & XmlParser.m

#import <Foundation/Foundation.h>

@interface XmlParser : NSObject <NSXMLParserDelegate> {
    NSString *urlString;
    NSURL *url;
    NSMutableString *xmlString;
}

- (IBAction)fetchXML:(id)sender;

@end

#import "XmlParser.h"
#import "Current.h"

@implementation XmlParser

- (void)awakeFromNib {
    [self fetchXML:self];
}

- (IBAction)fetchXML:(id)sender {
    urlString = @"http://api.wunderground.com/api/***/conditions/q/28173.xml";
    url = [NSURL URLWithString:urlString];

    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
    [parser setDelegate:self];
    [parser parse];
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {

    if ([elementName isEqual:@"temp_f"]) {
        xmlString = [[NSMutableString alloc] init];
    }
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {

    if ([elementName isEqual:@"temp_f"]) {        
        Current *cTempF = [[Current alloc] init];
        [cTempF setCurTempF:xmlString];
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    [xmlString appendString:string];
}

@end

プログラムを実行すると、「無効なパラメーターが満たされていません: aString」というエラーが表示されます。IBOutlet の setStringValue が機能していないようです。助言がありますか?

4

2 に答える 2

0

あなたが行っていたように、コードではなくペン先で Current を作成する必要があります。

パーサー (同じ nib にあると仮定します) を Current と通信させるには、パーサーに Current を指すアウトレットを作成し、そのアウトレットを nib に接続します。

于 2012-04-27T01:16:14.713 に答える
0

Current クラスを で初期化すると[[Current alloc] init]、textField に curTempF 文字列を入力しようとしていると思われます。ただし、curTempF 文字列は、 を呼び出すまで、その時点ではまだ初期化されていません[cTempF setCurTempF:xmlString]

1 つのアプローチは、Current クラスにアウトレットを表示しないことです。

- (void)awakeFromNib {
    //[self displayOutlets:self];
}

次に、パーサーで displayOutlets 関数を呼び出します。

if ([elementName isEqual:@"temp_f"]) {        
    Current *cTempF = [[Current alloc] init];
    [cTempF setCurTempF:xmlString];
    [cTempF displayOutlets:cTempF]; 
}

別の方法として、awakeFromNib コードを同じままにして、Current クラスに initWith メソッドを作成することもできます。

- (id) initWithCurTemp:(NSString *)curTemp {
    self = [super init]; 

    if (self) { 
        self.curTempF = curTemp; 
    }

    return self; 
}

- (void)awakeFromNib {
    [self displayOutlets:self];
}

次に、パーサー コードは次のようになります。

if ([elementName isEqual:@"temp_f"]) {        
    Current *cTempF = [[Current alloc] initWithCurTemp:xmlString];
}
于 2012-04-26T21:12:33.193 に答える