0

我有一个在按下按钮时触发的方法。这是大部分的实现:

[self.placeDictionary setValue:@"166 Bovet Rd" forKey:@"Street"];
    [self.placeDictionary setValue:@"San Mateo"  forKey:@"City"];
    [self.placeDictionary setValue:@"CA" forKey:@"State"];
    [self.placeDictionary setValue:@"94402" forKey:@"ZIP"];

    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    [geocoder geocodeAddressDictionary:self.placeDictionary completionHandler:^(NSArray *placemarks, NSError *error) {
        if([placemarks count]) {
            CLPlacemark *placemark = [placemarks objectAtIndex:0];
            CLLocation *location = placemark.location;
            CLLocationCoordinate2D coordinate = location.coordinate;
            PFGeoPoint* userLocation = [PFGeoPoint geoPointWithLatitude:coordinate.latitude longitude:coordinate.longitude];
            NSLog(@"%f,%f", userLocation.latitude, userLocation.longitude); 
        } else {
            NSLog(@"location error");
            return;
        }
    }];

但是,我收到以下异常:

*** WebKit discarded an uncaught exception in the webView:shouldInsertText:replacingDOMRange:givenAction: delegate: <NSUnknownKeyException> [<__NSDictionaryI 0x873a3c0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key Street.

我完全不知道这个例外意味着什么。有人可以帮我理解为什么它会产生这个吗?

4

1 回答 1

0

首先,您正在尝试将对象添加到不可变字典中。异常开头的部分[<__NSDictionaryI 0x873a3c0> setValue:forUndefinedKey:给出了一个类名__NSDictionaryI,它是NSDictionary类集群的一个不可变成员——所以你不能在运行时向它添加任何对象。您需要确保在调用此代码之前self.placeDictionary将其分配给实例。NSMutableDictionary

不幸的是,您还使用了错误的方法来添加对象 - 您使用setValue:forKey:的是setObject:forKey:. 由于此方法是NSKeyValueCoding非正式协议的一部分,因此您不会在编译时停止执行此操作。您应该改用setObject:forKey:which 是在NSMutableDictionary. 更正第一个问题后,将setValue:forKey:调用替换setObject:forKey:为 ,例如:

[self.placeDictionary setObject:@"San Mateo"  forKey:@"City"];
于 2013-09-10T04:15:49.780 回答