Ошибка «нераспознанный селектор» при попытке закрыть клавиатуру - PullRequest
0 голосов
/ 06 октября 2011

Я пытаюсь закрыть клавиатуру, когда пользователь нажимает «отменить» UIBarButtonItem. Однако, когда я нажимаю кнопку отмены, я получаю SIGABRT с ошибкой «нераспознанный селектор отправлен в экземпляр».

Мой код для создания кнопки отмены:

- (void)keyboardWasShown:(NSNotification*)aNotification
{
    //Add cancel button to navigation bar
    UIBarButtonItem *dismissKeyboardBttn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(dismissKeyboard:)];
    self.navigationItem.rightBarButtonItem = dismissKeyboardBttn;
}

И чтобы убрать клавиатуру у меня есть этот метод:

- (void)dismissKeyboard:(id)sender
{
    [activeField resignFirstResponder];
    //^^This line causes the SIGABRT^^
}

Это кажется довольно простым. Есть идеи?

UPDATE: activeField - это просто UITextField, который я использую для перемещения моего scrollView в UITextField, который пользователь в данный момент редактирует. Это устанавливается в этих двух методах:

- (void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
    activeField = textField; 
}
- (void)textFieldDidEndEditing:(UITextField *)textField 
{ 
    activeField = nil; 
}

ОБНОВЛЕНИЕ 2: Интересно, я зарегистрировал свой ViewController для получения уведомлений клавиатуры, и когда я пытаюсь отклонить клавиатуру, используя метод "textFieldShouldReturn", я получаю ту же ошибку. Вот мой код textFieldShouldReturn:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {

    if ([textField canResignFirstResponder])
    {
        [textField resignFirstResponder];
    }

    return YES;
}

Ответы [ 3 ]

1 голос
/ 19 декабря 2012

Я нахожусь в ситуации и делаю следующее в текущем контроллере представления:

В заголовочном файле создайте IBAction для текстового поля, которое стало первым респондентом, и откройте клавиатуру:

- (IBAction)textFieldDidBeginEditing:(UITextField *)textField;

В файле реализации создайте метод, который создает кнопку панели (в моем случае кнопку «Готово») и добавляет ее в правую часть панели навигации. Одновременно я создаю целевую пару действий между TextField (который стал первым респондентом

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    // create new bar button with "Done" as text
    // set the target of the action as the text field (since we want the text field to resign first responder status and dismiss the keyboard)
    // tell the text field to resign with the stock 'resignFirstResponder' selector
    UIBarButtonItem *bbi = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone
                                                                         target:textField
                                                                         action:@selector(resignFirstResponder)];

    // add the button with target/action pairing to the navigation bar
    [[self navigationItem] setRightBarButtonItem:bbi];
}

Кроме того, если вы хотите, чтобы кнопка исчезла после того, как я щелкнул по ней (и клавиатура исчезла), я использую textFieldDidEndEditing , поскольку редактирование теперь завершено с распознаванием первого респондента:

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    [[self navigationItem] setRightBarButtonItem:nil];
}
1 голос
/ 06 октября 2011

Что такое activeField?Если это UIResponder, он должен ответить на resignFirstResponder.Так что, возможно, это не так.UIViews и UIViewControllers являются UIResponders.

0 голосов
/ 06 октября 2011

Морнингстар прав, что такое activeField, это идентификатор, и вам необходимо добавить приведение: (UIButton*)? Кроме того, я всегда добавляю это, когда resignFirstResponder:

if(myObject canResignFirstResponder){

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