Xcode: передать NSString из одного класса в другую проблему - PullRequest
1 голос
/ 31 марта 2011

ОК, это должно быть легко, но я все еще ломаю голову здесь:

В моем корневом контроллере вида у меня есть NSString, называемый "entry", и он работает отлично. Я NSLogged это и работает. У меня есть другой класс с именем «ParseOperation», и в нем у меня есть NSString с именем «localEntry», и я пытаюсь отправить в «ParseOperation» переменную «entry» из «RootViewController», это мой код RootViewController для этого:

RootViewController.m  

ParseOperation *parseOperation = [[ParseOperation alloc] init];  
parseOperation.localEntry = entry;

Это просто не работает. Если я NSLog в моем ParseOperation.m, он возвращает «ноль», но если я делаю это на моем RootViewController, он возвращает правильную переменную. и да, я импортировал ParseOperation.h

Вот код ParseOperation (только часть, которая использует localEntry):

ParseOperation.h  

@interface ParseOperation : NSOperation <NSXMLParserDelegate>
{
    NSString        *localEntry;
}
@property (nonatomic, retain) NSString *localEntry;

@end

ParseOperation.m  

@synthesize localEntry;

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

    //NSLog(@"entrada %@",localEntry);
    if ([elementName isEqualToString:localEntry])
    {
        self.workingEntry = [[[AppRecord alloc] init] autorelease];
    }
    storingCharacterData = [elementsToParse containsObject:elementName];
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
                                  namespaceURI:(NSString *)namespaceURI
                                 qualifiedName:(NSString *)qName
{
    if (self.workingEntry)
    {
        if (storingCharacterData)
        {
            NSString *trimmedString = [workingPropertyString     stringByTrimmingCharactersInSet:
                                   [NSCharacterSet whitespaceAndNewlineCharacterSet]];
            [workingPropertyString setString:@""];  // clear the string for next time
            if ([elementName isEqualToString:kIDStr])
            {
                self.workingEntry.appURLString = trimmedString;
            }
            else if ([elementName isEqualToString:kNameStr])
            {        
                self.workingEntry.appName = trimmedString;
            }
            else if ([elementName isEqualToString:kImageStr])
            {
                self.workingEntry.imageURLString = trimmedString;
            }
            else if ([elementName isEqualToString:kArtistStr])
            {
                self.workingEntry.artist = trimmedString;
            }
        }
        else if ([elementName isEqualToString:localEntry])
        {
            [self.workingArray addObject:self.workingEntry];  
            self.workingEntry = nil;
        }
    }
}

СПАСИБО!

Ответы [ 3 ]

4 голосов
/ 31 марта 2011

По всей вероятности, rootViewController равен нулю. Когда вы объявляете и синтезируете свойство, оно создает для вас только методы получения / установки. Он не инициализирует переменную ни к чему.

Так как target-c позволяет вам сообщать nil, вы не потерпите крах, когда напишите:

NSString *localentry = rootViewController.entry;

Сообщения ноль просто возвращает ноль. Так что если rootViewController равен nil, то и localentry будет равен нулю.

Убедитесь, что вы на самом деле устанавливаете rootViewController для этого класса. Например,

ParseOperation *myOperation = [[ParseOperation alloc] init];
[myOperation setRootViewController:rootViewController];

Или убедитесь, что вы установили выходное соединение в Интерфейсном Разработчике. В любом случае, я подозреваю, что rootViewController равен нулю. (Вы можете проверить это с помощью операторов NSLog).

2 голосов
/ 31 марта 2011

Вы уверены, что, поскольку это IBOutlet, вы подключились к нему в конструкторе интерфейсов?

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

Чтобы ответить на мой собственный вопрос, мне просто нужно было соединить viewController и ParseOperation программным путем, добавив в заголовок в parseOperation следующее:

@class RootViewController;

RootViewController *rootViewController;

@property (nonatomic, retain) IBOutlet RootViewController *rootViewController;

И следующее в m-файле ParseOperation:

#import "RootViewController.h"

rootViewController = [[RootViewController alloc]init];

После этого в операции разбора я только что объявил:

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