2014-10-07 4 views
-1

Я использую API Google Адресов для iOS. Я работаю над созданием функции автозаполнения, и я помещаю предложения в 4 кнопки (по причинам, которые не имеют отношения к этому вопросу), но я замечаю, что, как только пользовательский ввод достигнет определенной длины, сбои приложений. Мой код выглядит следующим образом:Почему мое приложение вылетает, когда текст UITextField достигает определенной длины?

_request = [[NSMutableURLRequest alloc]init]; 
_escapedUrlString = [_textField.text stringByAddingPercentEscapesUsingEncoding: NSASCIIStringEncoding 
    _requestURL = [NSString stringWithFormat: @"https://maps.googleapis.com/maps/api/place/autocomplete/json?input=%@&key=mykey",_escapedUrlString]; 
[_request setURL: [NSURL URLWithString:_requestURL]]; 
[_request setHTTPMethod:@"GET"]; 
NSURLResponse *requestResponse; 
_requestHandler = [NSURLConnection sendSynchronousRequest:_request returningResponse:&requestResponse error:nil]; 
_requestReply = [[NSString alloc]initWithBytes: [_requestHandler bytes] length: [_requestHandler length] encoding: NSASCIIStringEncoding]; 
_data = [_requestReply dataUsingEncoding:NSUTF8StringEncoding]; 
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:_data options:0 error:nil]; 
[_pred1 setTitle: [[[_json objectForKey:@"predictions"] objectAtIndex:0]objectForKey:@"description"] forState: UIControlStateNormal]; 
[_pred2 setTitle: [[[_json objectForKey:@"predictions"] objectAtIndex:1]objectForKey:@"description"] forState: UIControlStateNormal]; 
[_pred3 setTitle: [[[_json objectForKey:@"predictions"] objectAtIndex:2]objectForKey:@"description"] forState: UIControlStateNormal]; 
[_pred4 setTitle: [[[_json objectForKey:@"predictions"] objectAtIndex:3]objectForKey:@"description"] forState: UIControlStateNormal]; 

В этом случае, _pred1, _pred2, _pred3, _pred4 мои кнопки и _textField, очевидно, текстовое поле, где ввод пользователя вводимое. Этот код находится в методе editChange - (IBEvent). Код работает, и предсказания автозаполнения заполняют названия кнопок.

Моя проблема заключается в том, что когда я ввожу строку определенной длины, я получаю следующее сообщение об ошибке:

2014-10-07 16:21:48.740 maptest[41319:529100] *** Terminating app due to uncaught exception 'NSRangeException', reason: '-[__NSCFArray objectAtIndex:]: index (1) beyond bounds (1)' 

Мое предположение состоит в том, как входная строка становится больше, число предсказаний укоротить, так нет ничего, чтобы включить в более поздние заголовки. Тем не менее, я не знаю, как остановить приложение от сбоя, как только количество возвращаемых прогнозов уменьшится.

Любая помощь приветствуется.

+0

вы указываете на несуществующий элемент, убедитесь, что объект для ключа @ «предсказания» имеет допустимое значение в позиции x –

+0

Я попытался добавить проверку состояния, если объект == nil и только изменение текста, если оно не было, но я все еще получаю ошибку. – JayB127

+0

Почему вы помещаете словарь JSON в переменную с именем 'json', но затем использовали другую переменную с именем' _json' для установки названий кнопок? И почему вы называете '[[_json objectForKey: @" прогнозы "]' ​​четыре раза? Вызовите его один раз и сохраните результат в переменной. Затем вы можете проверить его длину и повторно использовать переменную. – rmaddy

ответ

0

Вы говорите

[_pred1 setTitle: [[[_json objectForKey:@"predictions"] objectAtIndex:0]objectForKey:@"description"] forState: UIControlStateNormal]; 
[_pred2 setTitle: [[[_json objectForKey:@"predictions"] objectAtIndex:1]objectForKey:@"description"] forState: UIControlStateNormal]; 
[_pred3 setTitle: [[[_json objectForKey:@"predictions"] objectAtIndex:2]objectForKey:@"description"] forState: UIControlStateNormal]; 
[_pred4 setTitle: [[[_json objectForKey:@"predictions"] objectAtIndex:3]objectForKey:@"description"] forState: UIControlStateNormal]; 

... не глядя первых, чтобы увидеть, есть ли этоobjectAtIndex:0, objectAtIndex:1 и т.д. Посмотрите первым.

+0

Я попытался добавить условие проверки, если объект == nil и только изменение текста, если это не так, но я все еще получаю ошибку. – JayB127

+0

Это не тот объект, который равен нулю. Он никогда не может быть nil (вы не можете положить nil в NSArray). Это даже самый высокий показатель индекса. Вы не можете говорить об объекте в индексе '1' в массиве, который не выходит за пределы индекса' 0'. – matt

+0

Вот документы NSArray: https://developer.apple.com/library/IOS/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/index.html – matt

Смежные вопросы