iphone - 为什么我的数组显示为空,即使我已经向它们添加了值?

标签 iphone objective-c ios nsmutablearray nsxmlparser

我正在使用 NSXMLParser 解析 XML,我的应用程序中有一些 NSMutableArrays(实例变量)。当我解析 XML 文件时,我使用 XML 元素的值构建对象,并使用这些对象设置我的数组。

在我用这些对象设置数组的那一刻,我可以看到它们的值。但是一旦我完成了 XML 的解析,我想检索这些值,而数组现在是空的。

这是我的部分代码:

//STHelpViewController.h

#import <UIKit/UIKit.h>

@class SoftokeniPhoneAppDelegate, FAQ;
@interface STHelpViewController : UIViewController {
    UIView *viewAnswer;
    UINavigationBar *answerTitle;
    UIButton *answerDescription;
    NSArray *answersArray;
    NSMutableArray *faqs;     //THIS IS MY ARRAY WITH THE PROBLEM
    NSMutableString *currentElementValue;   
    FAQ *aFAQ;

    NSString* Answer1;
    NSString* Answer2;
    NSString* Answer3;
    NSString* Answer4;
}

@property (nonatomic, retain) IBOutlet  UIView *viewAnswer;
@property (nonatomic, retain) IBOutlet  UINavigationBar *answerTitle;
@property (nonatomic, retain) IBOutlet  UIButton *answerDescription;
@property (nonatomic, retain) NSMutableArray *faqs;

@property (nonatomic, retain)NSString* Answer1; 
@property (nonatomic, retain)NSString* Answer2; 
@property (nonatomic, retain)NSString* Answer3; 
@property (nonatomic, retain)NSString* Answer4; 


@end





//STHelpViewController.m


- (void)viewDidLoad {
    [super viewDidLoad];
    NSURL *url = [[NSURL alloc] initWithString:@"http://clientes.imit.cl/MovilPass/faq.xml"];
    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];

    //Initialize the delegate.
    STHelpViewController *parser = [[STHelpViewController alloc] initXMLParser];

    //Set delegate
    [xmlParser setDelegate:parser];

    //Start parsing the XML file.
    BOOL success = [xmlParser parse];

    if(success){
        NSLog(@"F.A.Q. loaded from XMl file");

        //HERE IS THE PROBLEM. AT THIS PART XCODE SAYS THAT faqs(my array) IS EMPTY

        Answer1 = [[[faqs objectAtIndex:0] valueForKey:@"Respuesta"]description];
        Answer2 = [[[faqs objectAtIndex:1] valueForKey:@"Respuesta"]description];
        Answer3 = [[[faqs objectAtIndex:2] valueForKey:@"Respuesta"]description];
        Answer4 = [[[faqs objectAtIndex:3] valueForKey:@"Respuesta"]description];
        answersArray = [[NSArray alloc] initWithObjects:Answer1,Answer2,Answer3,Answer4,nil];
    }
    else
    {
        NSLog(@"Error loading XML file for F.A.Q. Default data loaded instead.");
        answersArray = [[NSArray alloc] 
                        initWithObjects:@"El Movilpass es una nueva herramienta de Bci Móvil que le permitirá obtener la clave de  ocho dígitos desde su celular, sin tener que llevar el dispositivo electrónico. Regístrese para recibir la aplicación, cárguela en su Iphone y sincronícela.", 
                        @"El Movilpass es igual de válido que el dispositivo electrónico.  Sólo debe sincronizarlo correctamente en su celular, siguiendo uno a uno los pasos que le indiquen.",
                        @"Para sincronizar, presione el botón “Ajustes”, luego “Sincronizar” y obtendrá los siguientes pasos:\n \n Ingrese a su banca Internet. \n Entre a Seguridad y Emergencia. \n Click en Movilpass. \n Seleccione el botón 'Sincronizar'.",
                        @"Si se le perdió su TELEFONO, lo primero que debe hacer es llamar al 600 8242424 para que lo bloqueen. Una vez que obtenga el nuevo aparato, podrá solicitar nuevamente su Movilpass.", 
                        nil];   
    }                                   
}


- (STHelpViewController *) initXMLParser {

    [super init];

    //appDelegate = (SoftokeniPhoneAppDelegate *)[[UIApplication sharedApplication] delegate];

    return self;
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName
    attributes:(NSDictionary *)attributeDict {
    if([elementName isEqualToString:@"PreguntasFrecuentes"]) {
        faqs = [[NSMutableArray new]retain];        
    }
    else if([elementName isEqualToString:@"Item"]) 
    {
        aFAQ = [[FAQ alloc] init];
        aFAQ.itemID = [[attributeDict objectForKey:@"id"] integerValue];        
        NSLog(@"Leyendo valor de atributo id: %i", aFAQ.itemID);
    }
    NSLog(@"Procesando Elemento: %@", elementName);
}

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

    if(!currentElementValue)
        currentElementValue = [[NSMutableString alloc] initWithString:string];
    else
        [currentElementValue appendString:string];

    NSLog(@"Procesando Valor: %@", currentElementValue);

}

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

    if([elementName isEqualToString:@"PreguntasFrecuentes"])
        return;
    if([elementName isEqualToString:@"Item"]) {
        [faqs addObject:aFAQ];
        [aFAQ release];
        aFAQ = nil; 
    }
    else
    {
        [aFAQ setValue:currentElementValue forKey:elementName];     
    }
    [currentElementValue release];
    currentElementValue = nil;

    //IF I PRINT MY ARRAY HERE, I CAN SEE THE VALUES
}

我做错了什么?

最佳答案

在每次调用 didStartElement 时实例化 faqs = [[NSMutableArray new]retain];。我觉得很奇怪。你应该移动 faqs = [[NSMutableArray new]retain]; 到你的 viewDidLoad

此外,我不认为那里有retain的必要性。

关于iphone - 为什么我的数组显示为空,即使我已经向它们添加了值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4971102/

相关文章:

ios - 注册APNS错误,NSCocoaErrorDomain代码= 3000

iphone - 执行没有角点的透视变换

objective-c - UIView 子类调用 UIView+Category 方法时抛出 "Selector not found"

iphone - Objective-C : How do I draw lines with alpha in quad curve

ios - 如何在 iOS 的边框内获取带有标题的 View 的边框?

iphone - 从网络读取 .txt 文件 - Objective-C

iphone - 导航栏添加进度条

ios - scaleTimeRange 对音频类型 AVMutableCompositionTrack 没有影响

objective-c - 如何设计这样的UI控件?

objective-c - 如何在没有不必要的保留/释放调用的情况下安全地在 ARC 和 MRC 方法之间切换?