Ваша линия [self.toolbar removeFromSuperview];
приводит к тому, что панель инструментов становится nil
, поэтому он не появляется.
И как @jammycoder сказал, что вам нужно только установить inputAccessoryView
текстового поля. Так что, как он предложил и удалить строку self.textField.inputView = self.toolbar;
Редактировать
Я установки простой проект и поставить UIToolbar
и UITextView
на контроллере представления, в раскадровке. Эти два вида подключены (IBOutlets) к ViewController, так как вы возможно сделал ,.
Если я использую ваш код, он действительно не отображает клавиатуру, почему? Поскольку вы назначаете inputView
UITextView
.
Итак, давайте отлаживаем ваш код. Прежде всего добавьте букет из NSLog
таких утверждений.
- (void)viewDidLoad
{
[super viewDidLoad];
self.textField.delegate = self;
NSLog(@"1 %@", NSStringFromCGRect(self.toolbar.frame));
self.textField.inputAccessoryView = self.toolbar;
NSLog(@"2 %@", NSStringFromCGRect(self.toolbar.frame));
self.textField.inputView = self.toolbar;
NSLog(@"3 %@", NSStringFromCGRect(self.toolbar.frame));
[self.toolbar removeFromSuperview];
NSLog(@"4 %@", NSStringFromCGRect(self.toolbar.frame));
[self.textField becomeFirstResponder];
}
- (void)textViewDidBeginEditing:(UITextView *)textView
{
NSLog(@"5 %@", NSStringFromCGRect(self.toolbar.frame));
self.textField.inputAccessoryView = self.toolbar;
NSLog(@"6 %@", NSStringFromCGRect(self.toolbar.frame));
}
Это будет печатать что-то вроде:
2015-05-14 00:13:46.313 ToolbarKeyboard[8367:4583306] 1 {{0, 524}, {320, 44}}
2015-05-14 00:13:46.314 ToolbarKeyboard[8367:4583306] 2 {{0, 524}, {320, 44}}
2015-05-14 00:13:46.314 ToolbarKeyboard[8367:4583306] 3 {{0, 524}, {320, 44}}
2015-05-14 00:13:46.315 ToolbarKeyboard[8367:4583306] 4 {{0, 524}, {320, 44}}
2015-05-14 00:13:46.491 ToolbarKeyboard[8367:4583306] 5 {{0, 0}, {320, 0}}
2015-05-14 00:13:46.491 ToolbarKeyboard[8367:4583306] 6 {{0, 0}, {320, 0}}
Таким образом, мы обнаружили, что, так или иначе, ваш рост бар стал 0. И, честно говоря, я не знаю, почему, но позволяет продолжать наши отладки.
Как указано на @jammycoder вы сделать не необходимость в в inputView
из UITextView
вам только нужно сделать, если вы хотите пользовательской клавиатуры. Так что давайте изменим код, чтобы быть похожим на это:
- (void)viewDidLoad
{
[super viewDidLoad];
self.textField.delegate = self;
NSLog(@"1 %@", NSStringFromCGRect(self.toolbar.frame));
self.textField.inputAccessoryView = self.toolbar;
NSLog(@"2 %@", NSStringFromCGRect(self.toolbar.frame));
[self.toolbar removeFromSuperview];
NSLog(@"3 %@", NSStringFromCGRect(self.toolbar.frame));
[self.textField becomeFirstResponder];
}
- (void)textViewDidBeginEditing:(UITextView *)textView
{
NSLog(@"4 %@", NSStringFromCGRect(self.toolbar.frame));
self.textField.inputAccessoryView = self.toolbar;
NSLog(@"5 %@", NSStringFromCGRect(self.toolbar.frame));
}
Это напечатает, что высота панели осталась неизменной. И панель инструментов отображается над клавиатурой.
До сих пор я использовал реальное устройство для отладки, решил использовать симулятор. Подождите, он не открывает клавиатуру!Кажется, это новая функция Xcode 6, поэтому я сделал быстрый поиск и нашел этот stackoverflow: Xcode 6: Keyboard does not show up in simulator. Что говорилось в самом голосовавшем ответе, и все работает нормально.
Итак, одним словом. Следующий минимальный код приведет к желаемому поведению. И если вы используете симулятор для тестирования/отладки это убедитесь, что делать то, что описано здесь: https://stackoverflow.com/a/24497773/3927536
@interface ViewController()
@property (weak, nonatomic) IBOutlet UITextView *textField;
@property (weak, nonatomic) IBOutlet UIToolbar *toolbar;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.textField.inputAccessoryView = self.toolbar;
[self.textField becomeFirstResponder];
}
@end
Он еще не решил. Я не знаю, что я сделал неправильно. Теперь я добавил setFrame, но все еще не работаю. Спасибо за помощь! –
Это правильный ответ. Вы объявили свою панель инструментов «слабым», поэтому, когда вы удаляете FromSuperView, она освобождается. Если вы хотите сохранить его, объявите его «сильным» и не удаляйте из супер-представления. Добавление его в виде дополнительного представления в другое представление приведет к удалению его из предыдущего представления. – squarefrog
@ brenoMoraisHu3 проверьте обновленный ответ. –