【问题标题】:Exception [NSNull isEqualToString:]: unrecognized selector when i click on calloutAccessoryControlTapped异常 [NSNull isEqualToString:]:当我单击 calloutAccessoryControlTapped 时无法识别的选择器
【发布时间】:2011-05-11 21:42:42
【问题描述】:

我遇到了这个异常的问题,实际上,当我单击 pin 的 calloutAccessoryControlTapped 按钮时,我得到了这个异常,我尝试通过控制台中的 NSLog 跟踪错误,我找到了唯一的 pin导致此异常的值为<null>,我用一些代码解释:

for (int i=0; i<[array count]; i++) {
           NSDictionary *stationEnCours=[array objectAtIndex:i];
           location2D = (CLLocationCoordinate2D){ .latitude = lat, .longitude = lng };
           MyLocation *annotation=[[[MyLocation alloc]initWithName:ensStation distanceVersLaStation:distance coordinate:location2D]autorelease];

//here we set the properties before we get call to addAnnotation annotation.stationAdress=[stationEnCours objectForKey:@"ssiphone_adresse"];
           NSLog(@"%@",annotation.stationAdress);
           [mapView addAnnotation:annotation];
}

我有 4 个站点,在控制台中我得到了这个:

2011-05-11 22:27:11.768 TopStation[2370:207] A 51 - Aire de la Champouse
2011-05-11 22:27:11.769 TopStation[2370:207] <null>
2011-05-11 22:27:11.769 TopStation[2370:207] 467 Avenue Henri Mauriat
2011-05-11 22:27:11.769 TopStation[2370:207] Route de Berre - Jas de Bouffan

第二个是后来当我尝试点击它的calloutAccessoryControlTapped 时导致问题,所以我检查了我的数据库,它的地址是string 而不是null。 我有点困惑,为什么这个异常虽然都被检索为String ??我也尝试做同样的工作,但在服务器端,一切都很好,它没有显示我NULL,只在 iPhone 端和这个站。 如果这有帮助,出现问题的站的地址是: 1 Boulevard du Maréchal Juin

【问题讨论】:

  • 由于 nil 不能存储在集合中,因此您的 NSDictionary 包含 NSNull 对象。登录后,他们会打印&lt;null&gt;,所以这确实是问题发生的地方。您可以通过使用isEqual: 而不是isEqualToString: 来解决这个问题(它不在您发布的代码中)。
  • 嗨,谢谢你的回答,实际上,我不明白为什么以及在哪里应该使用isEqual:;谢谢 :)
  • 您应该使用isEqual:,因为您的字典或数组包含一个 NSNull 对象。由于isEqualToString: 仅由 NSString 类定义,因此您不能在 NSNull 实例上使用它。 isEqual: 是为所有对象定义的,在调用字符串时会自动调用isEqualToString:,因此使用起来很安全。查找您在数组或字典中的对象上使用isEqualToString: 的任何位置,并将其更改为isEqual:
  • 嗨,我在我的代码上使用了两次isEqualToString,与adress没有关系,但是,我将它替换为isEqual,我的问题仍然存在,我不明白为什么只有对于那个地址,它得到&lt;null&gt;
  • 崩溃是否可能在 MyLocation initWithName... 方法中,或者您调用的其他方法中?我不能告诉你为什么你会得到&lt;null&gt;,除了你收藏的东西。如果您发布更多发生崩溃的代码,这可能会有所帮助。

标签: objective-c web-services ios json


【解决方案1】:

在您的代码中的某个时刻,您要么在您认为是 NSString 但实际上是 NSNull 的对象上调用 isEqualToString:,或者(更有可能)您正在将 NSNull 传递给某个类的方法/属性需要一个 NSString。例如,您可能正在将 UILabel 的 text 属性设置为 annotation.stationAdress

您通常应该只在不能使用nil 的地方使用 NSNull,例如在 NSArray、NSDictionary 等中。从集合中提取可能的 NSNull 值后,您应该包含这样的语句以将其转换回 nil:

    if (value == [NSNull null]) value = nil;

【讨论】:

  • 嗨,实际上,我尝试将地址值分配给这样的标签文本:adresseStation.text=topStation.sstationAdress; 这是问题吗?如果它为空,为什么只有这个,虽然从网络服务检索到的所有数据都是string,最后,我应该在哪里测试你的陈述?谢谢
  • 这就是问题所在。我不知道您从 Web 服务接收到什么样的数据,也不知道您是如何解析它的,所以我无法开始告诉您为什么会收到 NSNull。如果不出意外,您可以在分配sstationAdress 的位置插入该测试。
  • 我应该这样做吗:if(topStation.sstationAdress==[NSNUll]){topStation.sstationAdress=nil}adresseStation.text=topStation.sstationAdress;
  • @Malek 差不多。它是[NSNull null],但您可能应该首先阻止它在该属性中...
【解决方案2】:

在使用 tableview 时要小心,并确保将数据(数组)传递给 tableview 数据源和委托方法。

【讨论】:

    猜你喜欢
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 2011-10-16
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多