2013-04-15 2 views
0

У меня есть одно текстовое поле и текстовое представление в представлении. Я хочу показать панель инструментов на клавиатуре при редактировании текста в textView, но я не хочу показывать панель инструментов при редактировании textField. Я использую ниже код:Невозможно вызвать UIKeyboardNotifications

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView 
{ 
    [super viewWillAppear:animated]; 

    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 
    [nc addObserver:self selector:@selector(keyboardWillShow:) 
       name: UIKeyboardWillShowNotification object:nil]; 
    [nc addObserver:self selector:@selector(keyboardWillHide:) 
       name: UIKeyboardWillHideNotification object:nil]; 
return YES; 
} 

и

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification 
               object:nil]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification 
               object:nil]; 

    return YES; 
} 

Моя проблема когда пользователь пытается изменить текстовое поле и сразу начать редактирование TextView мы не можем показать тулбар для этого тогда? Как показать панель инструментов на клавиатуре для такой ситуации?

+0

Кстати, почему вы вызываете метод 'viewWillAppear' в методе' textViewShouldBeginEditing'? – limon

ответ

1

Как это было объяснено выше на этой answer. UITextField и UITextView имеет свойство inputAccessoryView для> iOS3.2, вы можете установить любой вид, который хотите, и он отображается в верхней части клавиатуры. Таким образом, вам не нужно использовать UINotificationCenter. Вот код для выполнения того, что вы хотите.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    UIToolbar *keyboardToolbar =[[UIToolbar alloc] initWithFrame:CGRectMake(0,250,320,30)]; 
    keyboardToolbar.barStyle = UIBarStyleBlackOpaque; 
    UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleBordered target:self action:@selector(dismissKeyboard)]; 

    UIBarButtonItem *flex = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; 
    NSArray *items = [[NSArray alloc] initWithObjects:flex,barButtonItem, nil]; 
    [keyboardToolbar setItems:items]; 
    self.textView.inputAccessoryView =keyboardToolbar; 
} 

-(void)dismissKeyboard 
{ 
    [self.textView resignFirstResponder]; 
} 

Все, что вам нужно сделать, это установить inputAccessoryView для UITextView, поэтому для UITextField по умолчанию появится клавиатура.

Надеюсь, это поможет.

0

Вы должны использовать этот метод делегата, чтобы получить уведомление клавиатуры для UITextField или UITextView

- (void)keyboardWillShow:(NSNotification *)notification 
{ 
    //self.keyboardNotification = notification; //store notification and process on text begin delegate method. 
} 
+0

Да, я реализовал этот метод, но даже этот метод делегата не вызывается, когда пользователь переключается с textField на textView напрямую, поскольку клавиатура уже показана. –

+1

где вы установили 'делегат'? проверьте с помощью xib или 'self.textView.delegate = self' – Mani

+0

спасибо mani ... что я забыл добавить, но inputAccessoryView помогает моей проблеме, а также помогает мне оптимизировать мой код. –

0

Вы уже знаете, что вы должны использовать inputAccessoryView, но вот почему код не работает:

UIKeyboardWillShowNotification будет опубликован после того, как textFieldShouldBeginEditing: вернулся.

Это потому, что вы можете отменить редактирование, вернув NO с textFieldShouldBeginEditing:, и в этом случае не должно быть UIKeyboardWillShowNotification.

Не удаляйте уведомление в textFieldShouldBeginEditing:. В противном случае вы больше не наблюдаете это уведомление, когда оно опубликовано.

Если вы добавили уведомления в viewWillAppear:, удалите их в viewWillDisappear:.

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