【问题标题】:'NSInvalidArgumentException '-[NSTaggedPointerString count]: unrecognized selector sent to instance 0xa006162696a614e6''NSInvalidArgumentException'-[NSTaggedPointerString 计数]:无法识别的选择器发送到实例 0xa006162696a614e6'
【发布时间】:2017-12-23 00:46:26
【问题描述】:

我是一个新手,我在 iOS 中设计了一个天气预报应用程序作为我的第一个项目。

我设计了一个UISearchBar 用于搜索城市名称。搜索栏的作用是:

1) 步骤 1: 输入“Naji”。它在表格视图中显示了两个城市: 纳吉 纳吉

2) 第 2 步: 输入“纳吉”。它没有显示任何内容,因为结果为空。

(错误部分)

3) 第 3 步: 每当我输入“Najib”时,应用程序都会终止并出现以下错误:

*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[NSTaggedPointerString 计数]: 无法识别的选择器发送到实例 0xa006162696a614e6'


代码是:

    -(void)searchBar:(UISearchBar *)asearchBar textDidChange:(NSString *)searchText{

    if ([searchText length] <=                return;
    if ([searchText length]==0) {
            [discityname removeAllObjects];
            [discityname addObjectsFromArray:cityname];
    }else{
            [discityname removeAllObjects];
            NSURLSession *session=[NSURLSession sharedSession];
            NSString *complete_url=[NSString stringWithFormat:@"https://query.yahooapis.com/v1/public/yql?q=select%%20*%%20from%%20geo.places%%20where%%20text%%3D%%22%@%%25%%22&format=json&diagnostics=true&callback=",searchText];
            NSURLSessionDataTask *dataTask=[session dataTaskWithURL:[NSURL URLWithString:complete_url]completionHandler:^(NSData *data, NSURLResponse *response, NSError *error){
            NSDictionary *json=[NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
            NSLog(@"%@",json);
            NSMutableDictionary *currentDict = [[NSMutableDictionary alloc]initWithDictionary:json[@"query"]];
            int a=[[currentDict valueForKey:@"count"] intValue];
            if (a!=0) {
                cityname=[[NSMutableArray alloc]init];
           // if ([currentDict valueForKey: @"results"] != [NSNull null])
          //  {
                NSMutableDictionary *conDict = [[NSMutableDictionary alloc]initWithDictionary:currentDict[@"results"]];
                NSMutableArray *places=[conDict valueForKey:@"place"];
                NSMutableArray *country=[places valueForKey:@"country"];
                NSMutableArray *countryname=[country valueForKey:@"content"];
                NSMutableArray *placeName= [places  valueForKey:@"name"];
                NSMutableArray *centroid=[places valueForKey:@"centroid"];
                NSMutableArray *latitude=[centroid valueForKey:@"latitude"];
                NSMutableArray *longitude=[centroid valueForKey:@"longitude"];
                //if ([placeName isKindOfClass:[NSMutableArray class]]) {
                //}
                //cityname=[[NSMutableArray alloc]initWithArray:placeName];
                NSLog(@"%lu",placeName.count);
                for (int i=0; i<placeName.count; i++) {
                    [cityname addObject:[placeName objectAtIndex:i]];
                     [countrynames addObject:[countryname objectAtIndex:i]];
                }
                dispatch_async(dispatch_get_main_queue(), ^{
                    discityname=[[NSMutableArray alloc]initWithArray:cityname];
                    discountryname=[[NSMutableArray alloc]initWithArray:countrynames];
                    latitudenames=[[NSMutableArray alloc]initWithArray:latitude];
                    longitudenames=[[NSMutableArray alloc]initWithArray:longitude];
                    [tableView reloadData];
                });
            }
           // for(int i=0;i<[placeName count];i++)
          //i  NSLog(@"The place is: %@ , %@, %@, %@",placeName[i],countryname[i],latitude[i],longitude[i]);
        }];
        [dataTask resume];
        for (NSString *string in discityname) {
            NSRange r=[string rangeOfString:searchText options:NSCaseInsensitiveSearch];
            if (r.location!=NSNotFound) {
                [discityname addObject:string];
            }
        }
    }
    [tableView reloadData];
}

答案:它应该显示 json 中返回的城市名称“Najib”。

【问题讨论】:

  • 某处有一个你认为是NSArray但实际上是NSString的对象。可能是使用valueForKey:
  • @XYZ,当您创建多个可变数组时,它们将返回一个 nil 对象(因为每个可变对象都需要初始化),请先将您的可变数组替换为 NSArray
  • @ParvendraSingh 问题尚未解决!
  • @Larme 你能详细说明解决方案吗
  • 使用调试器并准确找到导致问题的行。您可能还想向我们展示 json 以防万一它有效,万一它不起作用。

标签: ios objective-c nsmutablearray uisearchbar nsmutabledictionary


【解决方案1】:

你可以在 Xcode 中添加异常断点,它会告诉你哪一行崩溃了 在Xcode中,打开左侧面板,进入Show the breakpoint navigator,在左下角,点击加号图标并添加Exception breakpoint

【讨论】:

  • [placeName addObject:[[places objectAtIndex:j]valueForKey:@"name"]];它显示错误是这一行但无法识别问题
  • 尝试将代码拆分为多行。将 [places objectAtIndex:j] 放入变量“place”中。与 [place valueForKey:@"name"] 相同
  • 是的,这是 JSON 数据的问题。每当 json 返回两个值时,json(“places”)是 nsmutable 数组格式,但在一个值的情况下它是 nsdictionary。无论如何感谢您的建议。
  • 好的,我总是很乐意提供帮助。如果它对您有帮助,您能否将我的回复标记为绿色复选标记?
  • 感谢您的回答...因此解决了我的一个问题...谢谢您... :)
猜你喜欢
  • 2018-09-28
  • 1970-01-01
  • 2013-12-26
  • 2012-07-16
  • 2018-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多