2012-02-15 2 views
1

Я использую следующий код для анализа XML-файла в Интернете. Когда я запускаю приложение, мои текстовые поля пусты. Как извлечь строки из NSXMLParser и поместить их в IBOutlets, такие как текстовые поля, элементы меню или метки?Невозможно получить данные NSXMLParser в текстовое поле, пункт меню или метку

интерфейс файла: файл

#import <Foundation/Foundation.h> 

@interface XMLCurrent : NSObject <NSXMLParserDelegate> { 
    IBOutlet NSTextField *location; 
    IBOutlet NSTextField *condition; 
    IBOutlet NSTextField *degreesF; 

    NSMutableString *xmlLocation; 
    NSMutableString *xmlWeather; 
    NSMutableString *xmlTempF; 
} 

- (void)fetchCurrentWeather:(id)sender; 

@end 

реализация:

#import "XMLCurrent.h" 

@implementation XMLCurrent 

- (void)fetchCurrentWeather:(id)sender { 

    NSURL *xmlURL = [NSURL URLWithString:@"http://www.weather.gov/xml/current_obs/KCLT.xml"]; 

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

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

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

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

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

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 

    [xmlLocation appendString:string]; 
    [xmlWeather appendString:string]; 
    [xmlTempF appendString:string]; 
} 

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

    if ([elementName isEqual:@"location"]) { 
     [location setStringValue:xmlLocation]; 
    } 

    if ([elementName isEqual:@"weather"]) { 
     [condition setStringValue:xmlWeather]; 
    } 

    if ([elementName isEqual:@"temp_f"]) { 
     [degreesF setStringValue:xmlTempF]; 
    } 
} 

@end 
+0

Ваш код выглядит правильно, вы уверены, что ваши 'IBOutlet' правильно подключены? – dasblinkenlight

+0

Вы пытались остановиться в отладчике, чтобы увидеть, что выходы не ноль? – dasblinkenlight

+0

Создайте свою программу для запуска в симуляторе, установите точку останова на строке, которая говорит 'if ([elementName isEqual: @" location "])', щелкнув по вертикальной панели слева от текстового пространства вашего редактора и запустив точки останова включены. Как только ваша точка останова будет удалена, наведите курсор на переменную 'location', чтобы увидеть ее значение. – dasblinkenlight

ответ

0

Я думаю, что может быть две причины вашей проблемы:

  1. Вы разборе XML перед viewDidLoad был вызван, и поэтому все ваши выходы ноль

  2. Вы не подключили их в Interface Builder.

+0

Я уверен, что мои розетки подключены правильно. См. Мой предыдущий комментарий выше. – wigging

+0

Итак, как я могу применить разум 1? – wigging

+0

Спасибо, что получил работу. Я заменил метод '(void) fetchCurrentWeather: (id) sender' с помощью' (void) awakeFromNib' – wigging