Невозможно установить iVars в XMLParser
Я создал класс XMLParser в target-c, и я не могу установить iVars в моем общем хранилище в процессе синтаксического анализа, я пробовал множество способов, но ничего не получилось.
Это мой код и то, что возвращается. Здесь мы надеемся, что это небольшая синтаксическая ошибка, которую я пропустил.
.час
@interface XMLParser : NSXMLParser <NSXMLParserDelegate>
{
XMLParser *XMLStore;
}
@property(nonatomic, weak)NSMutableString *longitudeValue;
@property(nonatomic, weak)NSMutableString *latitudeValue;
+ (XMLParser *)sharedStore;
- (void)parseXMLAtURL:(NSURL *)url;
@end
.m
#import "XMLParser.h"
@implementation XMLParser
BOOL blockLatLong = NO;
NSMutableString *currentNodeContent;
+ (XMLParser *)sharedStore
{
static XMLParser *XMLStore = nil;
if (!XMLStore)
XMLStore = [[XMLParser alloc] init];
return XMLStore;
}
- (void)parseXMLAtURL:(NSURL *)url
{
NSXMLParser *parser = [[XMLParser alloc] initWithContentsOfURL:url];
parser.delegate = self;
[parser setShouldProcessNamespaces:NO];
[parser setShouldReportNamespacePrefixes:NO];
[parser setShouldResolveExternalEntities:NO];
[parser parse];
NSLog(@"Long:%@, Lat:%@", XMLStore.longitudeValue, XMLStore.latitudeValue);
}
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
currentNodeContent = [NSMutableString stringWithString:string];
}
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
if ([elementName isEqualToString:@"geometry"]){
blockLatLong = YES;
}
if ([elementName isEqualToString:@"location_type"]){
blockLatLong = NO;
}
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if (blockLatLong){
if ([elementName isEqualToString:@"lng"]){
[XMLStore setLongitudeValue:currentNodeContent];
NSLog(@"%@", currentNodeContent);
NSLog(@"%@", XMLStore.longitudeValue);
}
if ([elementName isEqualToString:@"lat"]){
[XMLStore setLatitudeValue:currentNodeContent];
NSLog(@"%@", currentNodeContent);
NSLog(@"%@", XMLStore.latitudeValue);
}
}
}
@end
Журнал
2013-09-23 11:19:59.606 Weathalert[640:c07] 40.7143528
2013-09-23 11:19:59.606 Weathalert[640:c07] (null)
2013-09-23 11:19:59.607 Weathalert[640:c07] -74.0059731
2013-09-23 11:19:59.607 Weathalert[640:c07] (null)
2013-09-23 11:19:59.607 Weathalert[640:c07] Long:(null), Lat:(null)
1 ответ
Ваша проблема в том, что у вас есть три экземпляра XMLParser
где вы могли бы установить переменную экземпляра:
- Местный
NSXMLParser *parser
выделяется внутриparseXMLAtURL:
, - Функция статическую
static XMLParser *XMLStore
выделяется внутриsharedStore
, а также - Переменная экземпляра
XMLParser *XMLStore;
который вы никогда не выделяете, поэтому он остаетсяnil
,
Это третий случай, когда вы пытаетесь вызвать свои сеттеры. Так как это nil
, звонки не имеют никакого эффекта: [XMLStore setLongitudeValue:...]
ничего не делает.
Чтобы это исправить, удалите вторую и третью переменные вместе с +(XMLParser *)sharedStore
метод. Используйте обычные свойства экземпляра вместо доступа к общему.
Вы можете получить результаты от местных parser
переменная по завершении [parser parse]
вызов:
NSLog(@"Long:%@, Lat:%@", parser.longitudeValue, parser.latitudeValue);