Вы приняли UIKeyInput
в UIViewController
.Обратите внимание на определение наследования, которое вы ввели:
@interface Pedal_ProtocolViewController : UIViewController <UIKeyInput, UITextInput>{
Вы сказали здесь: «Это контроллер представления, который реализует UIKeyInput
и UITextInput
».Эти два протокола применяются к UIResponder
подклассам, таким как UIView
и подклассам или UIView
.UIViewController
не является ни одним из таких классов , возможно, не лучшим классом для обработки ввода текста.
Контроллеры представления управляют представлениями.Они сами не являются представлениями.
Вы можете (вместо протоколов ввода текста) просто использовать скрытое текстовое поле (например, то, которое у вас уже есть).Просто создайте подкласс NSObject
, который реализует делегат для текстового поля, и назначьте его в качестве делегата текстового поля.Затем в -viewDidAppear:
вызовите -becomeFirstResponder
в текстовом поле, чтобы сфокусироваться на поле.Вы, вероятно, можете использовать некоторые хаки, чтобы скрыть клавиатуру.
Этот подход обычно использовался в играх и библиотеках, поддерживающих игры, для демонстрации программной клавиатуры.Он даже работает на iOS 3.1.3 и более ранних версиях (что не является проблемой для вас, учитывая, что вы разрабатываете для iPad).
В случае, если вы сохраните этот дизайн (обработка ввода вконтроллер), тогда это может потребоваться и заставить его работать.
-(BOOL)canBecomeFirstResponder
{
return YES;
}
-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self becomeFirstResponder];
}
Обдумайте возможность использования UITextField
и делегата для обработки ввода или реализации двух вышеупомянутых функций и протокола UIKeyInput
вподкласс UIView
.
Также обратите внимание, что вы не обязаны соблюдать UITextInput
только для получения нажатий клавиш;UIKeyInput
достаточно.
Дополнительное примечание: если вы решите подкласс UIView
(что, наряду с использованием скрытого UITextField
, то, что я делаю; я не пробовал создавать подклассы UIViewController
, чтобы получить ввод с клавиатуры), вам нужно добавить -becomeFirstResponder
к -awakeFromNib
вместо:
-(void)awakeFromNib
{
[super awakeFromNib];
[self becomeFirstResponder];
}
Это если вы загружаете UIViewController
(и, следовательно, UIView
) изпероНе делаете это?Попробуйте добавить это в -initWithFrame:
:
-(id)initWithFrame:(CGFrame)frame
{
self = [super initWithFrame:frame];
if(!self)
return nil;
[self becomeFirstResponder];
return self;
}
В качестве альтернативы в UIViewController viewDidLoad
:
// ...
[self.view becomeFirstResponder];
// ...
Существует множество способов сделать это.;)