Цель C: Передача NSDictionary из одного класса в другой - PullRequest
1 голос
/ 07 июля 2011

Все,

Отказ от ответственности: я знаю, что есть другие вопросы, которые задают подобные вопросы, но ни один из них не дает ответа, который я понимаю, или ответа, относящегося к моей ситуации.

У меня есть два класса, classA и classB.В classA есть метод экземпляра void, который создает NSMutableDictionary (если вам нужны подробности, это XMLparser).После запуска XMLParser класса A и создания и заполнения NSMutableDictionary вызывается classB, который должен выполнить некоторые другие действия с этим словарем.По какой-то причине classB не может получить доступ к NSMutableDictionary в classA (фактически, он может получить к нему доступ, но по какой-то причине он отображается как "NULL").Что мне делать?

Заранее спасибо.

РЕДАКТИРОВАТЬ: Вы запросили исходный код, вы получили его.Класс А ниже, рассматриваемый словарь называется «ответ».

#import "XMLParser.h"
#import "CardSetupViewController.h"

@implementation XMLParser

@synthesize response;

- (XMLParser *) initXMLParser
{
    self = [super init];
    // init dictionary of response data 
    response = [[NSMutableDictionary alloc] init];
    return self;
}

//Gets Start Element of SessionData
- (void)parser:(NSXMLParser *)parser 
        didStartElement:(NSString *)elementName 
        namespaceURI:(NSString *)namespaceURI 
        qualifiedName:(NSString *)qualifiedName 
        attributes:(NSDictionary *)attributeDict 
{

    if ([elementName isEqualToString:@"SessionData"]) 
    {
        NSLog(@"Found SessionData in the return XML! Continuing...");
        //response is a NSMutableArray instance variable

        //THIS SHOULD NEVER NEED TO BE USED
            if (!response)//if array is empty, it makes it!
            {
                NSLog(@"Dictionary is empty for some reason, creating...");
            response = [[NSMutableDictionary alloc] init];
            }
        //END: THIS SHOULD NEVER BE USED
        return;
    }
    else
    {
        currentElementName = elementName;
        NSLog(@"Current Element Name = %@", currentElementName);
        return;
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{
    if (!currentElementValue) {
        // init the ad hoc string with the value     
        currentElementValue = [[NSMutableString alloc] initWithString:string];
    } else {
        [currentElementValue setString:string];
        NSLog(@"Processing value for : %@", string);
    }
}  

//Gets End Element of SessionData
- (void)parser:(NSXMLParser *)parser 
 didEndElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI 
 qualifiedName:(NSString *)qName {

    if ([elementName isEqualToString:@"SessionData"]) 
    {
        // We reached the end of the XML document
        // dumps dictionary into log
        NSLog(@"Dump:%@", [response description]);
        return;
    }
    else
    {
        //Adds key and object to dictionary
        [response setObject:currentElementValue forKey:currentElementName];
        NSLog(@"Set values, going around again... brb.");
    }
    currentElementValue = nil;
    currentElementName = nil;
}


@end

Ответы [ 4 ]

1 голос
/ 07 июля 2011

Возможно, вы захотите использовать синглтоны.

http://www.galloway.me.uk/tutorials/singleton-classes/

http://pixeleap.com/?p=19

http://www.iphonedevsdk.com/forum/iphone-sdk-development/5302-how-make-global-variables-objectivec.html

Это должно помочь вам начать, если вам нужны разъяснения, просто спросите.

0 голосов
/ 23 ноября 2011

Прежде всего проверьте, получили ли вы ответ в этом методе делегата NSXMLParser

- (void)parserDidEndDocument:(NSXMLParser *)parser;

и отправьте ответ через делегата (который вы должны реализовать в этом классе), а метод делегата должен быть реализован в другом классе ... Просто !!!

0 голосов
/ 08 июля 2011

у вас есть несколько вариантов ... так много вариантов на самом деле

Вариант A: (установить)

@interface ClassB{
NSDictionary * someDict;
}
-(void)setSomeDict:(NSDictionary *)aDict;
@end

@implementation ClassB
-(void)setSomeDict:(NSDictionary *)aDict
{
   someDict = [aDict retain];//or copy depending on your needs;
}

@end

somewhere in ClassA...

ClassB * b = [ClassB new];
[b setSomeDict: someOtherDict];

Вариант B: (нажать)

@interface ClassB{
NSDictionary * someDict;
}
-(void)doSomethingWithDict:(NSDictionary *)aDict;
@end

@implementation ClassB
-(void)doSomethingWithDict:(NSDictionary *)aDict
{
   NSLog(@"did something with aDict: %@",aDict);
}

@end

somewhere in ClassA...

ClassB * b = [ClassB new];
[b doSomethingWithDict: someOtherDict];

Опция c: (init)

@interface ClassB{
NSDictionary * someDict;
}
-(id)initWithDict:(NSDictionary *)aDict;
@end

@implementation ClassB
-(id)initWithDict:(NSDictionary *)aDict
{
   self = [super init];
   if(self)
   {
        someDict = [someDict retain]; //or copy depending on your needs
   }
   NSLog(@"did something with aDict: %@",aDict);
}

@end

somewhere in ClassA...

ClassB * b = [[ClassB alloc] initWithDict:someOtherDict];
[b doSomethingelse];

Вы также можете использовать свойства и т. Д. Есть много вариантов, но вытакже следует понимать владение объектами, чтобы не допустить утечки словаря.

-(void)dealloc
{
    [someDict release];
}

должен быть добавлен к классу B.

0 голосов
/ 08 июля 2011

currentElementName и currentElementValue ивары? Если это так, то каждый раз, когда вы ловите элемент или значение, вы должны выпустить свой ivar и сохранить новое значение, которое вы поймали.

Кроме того, в комментариях говорится, что вы не следовали никаким правилам написания правильного инициализатора.

А как насчет classB? Есть ли какая-то логика, которая делает ваш словарь выпущенным? Попробуйте немного больше памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...