Xcode:将NSString从一个类传递到另一个类

时间:2011-03-30 23:01:42

标签: iphone objective-c cocoa-touch xcode

好的,这应该是一个简单的,但我仍然在这里打破我的头脑:

在我的根视图控制器中,我有一个名为“条目”的NSString并且工作正常。我NSLogged它和它的工作原理。 我有另一个名为'SomeOperation'的类,其中有一个名为“localEntry”的NSString,我试图从“RootViewController”向“ParseOperation”发送变量“entry”,这是我的RootViewController代码: / p>

RootViewController.m  

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

它不起作用。如果我在ParseOperation.m中NSLog它返回“null”,但是如果我在我的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 个答案:

答案 0 :(得分:4)

很可能,rootViewController是nil。声明和合成属性时,它只为您创建getter / setter方法。它不会将变量初始化为任何内容。

由于objective-c允许您发送nil消息,因此在写入时不会崩溃:

NSString *localentry = rootViewController.entry;

消息传递nil只返回nil。因此,如果rootViewController为nil,那么localentry也将为nil。

确保您实际为此类设置rootViewController。例如,

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

或者,确保您已在Interface Builder中建立了出口连接。无论如何,我怀疑rootViewController是零。 (您可以使用NSLog语句对此进行测试)。

答案 1 :(得分:2)

您确定,因为它是一个IBOutlet,您在界面构建器中连接到它吗?

答案 2 :(得分:0)

要回答我自己的问题,我只需要以编程方式连接viewController和ParseOperation,方法是将以下内容添加到parseOperation中的标题中:

@class RootViewController;

RootViewController *rootViewController;

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

以下是关于ParseOperation的m文件:

#import "RootViewController.h"

rootViewController = [[RootViewController alloc]init];

之后在解析操作中我刚刚声明:

localEntry= rootViewContoller.entry;