- [UIThreePartButton text]: нераспознанный селектор - PullRequest
0 голосов
/ 10 декабря 2010

Я какое-то время стучал по этому, и не могу понять.

Это лист действий, который закладывает страницу (для приложения, похожего на сафари). Когда я нажимаю «Хорошо», я получаю - [UIThreePartButton text]: нераспознанный селектор в экземпляре 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]).text==@""||((UITextField*)[alertView.subviews objectAtIndex:4]).text==nil)
        {

Специально на if(((UITextField*)[alertView.subviews objectAtIndex:4])

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

Ответы [ 2 ]

2 голосов
/ 10 декабря 2010

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

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

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

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

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

Являясь FYI, вы также пропускаете siteName UITextField в приведенном выше коде и, возможно, свой UIAlertView.

0 голосов
/ 10 декабря 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...