2010-12-10 2 views
0

Я уже некоторое время ломаю себя на этом и не могу понять.- [UIThreePartButton text]: непризнанный селектор

Он является лист действие, закладки на страницу (для сафари, как приложение) Когда я ударил Хорошо, я получаю - [UIThreePartButton текст]: непризнанный селектор в случае XXXX

я не могу, кажется, шаг за шагом, где моя боль.

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    if (buttonIndex == 0) 
    { 
     UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"Bookmarks" message:@"Please enter the site name: \n \n \n" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok", nil]; 
     alert.center=CGPointMake(160, 50); 
     alert.tag=1; 

     UITextField *siteName=[[UITextField alloc]initWithFrame:CGRectMake(20, 70, 245, 30)]; 
     siteName.backgroundColor=[UIColor clearColor]; 
     siteName.borderStyle=UITextBorderStyleRoundedRect; 
     siteName.autocorrectionType=UITextAutocorrectionTypeNo; 
     siteName.delegate=self; 
     siteName.clearButtonMode=UITextFieldViewModeWhileEditing; 
     siteName.text=[[mainDelegate.sitesArray objectAtIndex:tag] objectForKey:@"webSite"]; 
     siteName.returnKeyType=UIReturnKeyDone; 
     siteName.tag=2; 
     [alert addSubview:siteName]; 

     [alert show]; 
    } 
} 

я понял, что он умирает на оповещения методом просмотра под ним:

if(alertView.tag==1) 
    if (buttonIndex==1) 
    { 
     if(((UITextField*)[alertView.subviews objectAtIndex:4])[email protected]""||((UITextField*)[alertView.subviews objectAtIndex:4]).text==nil) 
     { 

Spefically на if(((UITextField*)[alertView.subviews objectAtIndex:4])

У меня есть 4 кнопки/действие на этом действие листа, а остальные хорошо идти ...

+0

Когда вы устанавливаете точку останова на исключения и включаете точки останова, на какой строке останавливается ваше приложение? – 2010-12-10 15:29:45

+0

е (alertView.tag == 1) \t \t если (buttonIndex == 1) \t \t { \t \t \t если (((UITextField *) [alertView.subviews objectAtIndex: 4].) Текст == @» "|| ((UITextField *) [alertView.subviews objectAtIndex: 4]).текст == ноль) \t \t \t { – Jason 2010-12-10 15:43:59

ответ

0

Если у вас есть 4 кнопки за действие, ваш объектAtIndex не будет 3 вместо 4? Похоже, вы получаете исключение из-за пределов.

В частности, objectAtIndex:4 будет генерировать исключение, если в массиве есть 4 элемента, поскольку последний действительный индекс равен 3.

2

Не пытайтесь вручную перемещать иерархию представления элемента пользовательского интерфейса, который Apple не документирует иным образом. Выполнение чего-то вроде [alertView.subviews objectAtIndex:4] опасно, потому что вам приходится делать слепое предположение о внутренней структуре UIAlertView.

В этом случае вы попадаете в неправильный элемент (UIThreePartButton) и сворачиваете свое приложение с исключением. Даже если вы правильно указали, где находится ваше текстовое поле, нет никакой гарантии, что Apple не изменит номер представления или порядок в будущей версии ОС, что внезапно приведет к сбою всех установок вашего приложения.

Чтобы предотвратить это, держитесь за ссылку на свой UITextField, поэтому вам не нужно исследовать иерархию представления в UIAlertView.

Даже лучше, не используйте представление предупреждения для ввода текста, но пользовательский режим просмотра. Предупреждения действительно должны быть зарезервированы для редких отображений ошибок или других критических обновлений. Из iOS Human Interface Guidelines:

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

В качестве FYI, вы также утечка ваш siteName UITextField в коде выше, и, возможно, ваш UIAlertView.

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