NSUnknownKeyException - 类文件中的setValue:forUndefinedKey

时间:2011-12-08 15:32:28

标签: iphone objective-c ios xcode4.2 nsxmlparser

我是iPhone开发的新手,我收到了这个错误输出。我知道发生了什么,我只是不知道如何解决它。

 Terminating app due to uncaught exception 'NSUnknownKeyException', reason: 
'[<loginData 0x6b1c> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key UserEMailAddress.'

基本上我使用XML解析器并尝试将数据存储到我创建的类'loginData'中。我来的第一个元素是UserEMailAddress,代码试图将该值存储到同名的类变量UserEMailAddress中。但它抛出了这个错误。

当我创建课程时,显然出现了问题。不知怎的,我猜测事情没有正确设置,也无法将数据输入到课堂中。我创建loginData所做的就是做一个文件 - &gt; new-&gt;类对象。

这是课程代码。

loginData.h

#import <Foundation/Foundation.h>

@interface loginData : NSObject{
  NSString *UserEMailAddress;
  NSString *SessionUID;
  NSString *SessionExpirationUTCDT;

 }

@property (nonatomic, retain) NSString *UserEMailAddress;
@property (nonatomic, retain) NSString *SessionUID;
@property (nonatomic, retain) NSString *SessionExpirationUTCDT;

@end

loginData.m

  #import "loginData.h"

  @implementation loginData

  @synthesize UserEMailAddress=_UserEMailAddress;
  @synthesize SessionUID=_SessionUID;
  @synthesize SessionExpirationUTCDT=_SessionExpirationUTCDT;

  @end

非常简单的东西,没什么太复杂的。

在崩溃之前访问的最后一个方法是在我的XMLParser中,它是..

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

我确信我在上课时犯了一个小错误,但我不知道那会是什么。提前谢谢。

另一种看起来好像变量输入到我的类的方法就是这个。

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

   if ([elementName isEqualToString:@"LoginResponse"]) {
       // We reached the end of the XML document
       return;
   }

  //if ([elementName isEqualToString:@"user"]) {
      // We are done with user entry – add the parsed user 
      // object to our user array
      //[users addObject:user];
      // release user object
      //[user release];
      //user = nil;
   // } 
   else {
        // The parser hit one of the element values. 
      // This syntax is possible because User object 
       // property names match the XML user element names   
      [loginData setValue:currentElementValue forKey:elementName];
  }   

  currentElementValue = nil;
}

5 个答案:

答案 0 :(得分:2)

让我们看看你的代码:

loginData.h

@interface loginData : NSObject{
  NSString *UserEMailAddress;
  ...
 }

@property (nonatomic, retain) NSString *UserEMailAddress;
...

@end

loginData.m

@implementation loginData

@synthesize UserEMailAddress=_UserEMailAddress;
...

@end

如果您注意到,则将该属性合成为缺少的变量名_UserEMailAddress。你应该用UserEMailAddress替换它,你的代码将正常工作。

答案 1 :(得分:2)

我遇到了同样的问题,因为我从标题 - * .h - 文件开始手动重命名了一个属性。它看起来像这样,在某处手动重命名的属性仍然用原始名称引用。

为了解决这个问题,我将属性重命名为原始名称,并从源文件 - * .m开始重命名。

答案 2 :(得分:0)

这里的问题可能是您没有正确遵守Key Value Coding主体。例如,this document描述了“key” must begin with a lowercase letter。如果你不遵循't'的文档 - 特别是关于像KVC那样基本的东西 - 你可能冒险进入奇怪的,有时无法解释的行为。

答案 3 :(得分:0)

我设法解决它,因为我使用相同的例子。 我所做的是使用xml中的名称作为我的XMLParser.h中的变量 例如,如果您的XML文件是这样的:

<Foo>
 <Param1>
  <UserEMailAddress>foo</UserEMailAddress>
  <SessionUID>foo</SessionUID>
  <SessionExpirationUTCDT>foo</SessionExpirationUTCDT>
 </Param1>
</Foo>

您的loginData.h将保留:

#import <Foundation/Foundation.h>

@interface loginData : NSObject{
  NSString *UserEMailAddress;
  NSString *SessionUID;
  NSString *SessionExpirationUTCDT;

 }

@property (nonatomic, retain) NSString *UserEMailAddress;
@property (nonatomic, retain) NSString *SessionUID;
@property (nonatomic, retain) NSString *SessionExpirationUTCDT;

@end

就我的项目而言,我收到空的和正确的数据,例如:

2013-03-29 20:23:40.862 ******* [5271:907] Preccessing value for : 

2013-03-29 20:23:40.863 *******[5271:907] Preccessing value for : 20/03/13
2013-03-29 20:23:40.865 *******[5271:907] Preccessing value for : 

2013-03-29 20:23:40.866 *******[5271:907] Preccessing value for : 14:07
2013-03-29 20:23:40.868 *******[5271:907] Preccessing value for :  

这是解析后的数据,而不是标签,但这是一个开始。

答案 4 :(得分:0)

转到loginData视图控制器&amp;的xib的连接检查器。删除UserEMailAddress的引用。之后它会运行。试试吧...... :)