Ответ 1
Вы не можете вызвать клавиатуру без объекта, который может стать первым ответчиком. Существует два способа обойти:
-
Подкласс a
UIView
и реализовать в нем протоколUIKeyInput
. Например:В вашем .h файле:
@interface InputObject : UIView<UIKeyInput> @property (nonatomic, copy) NSString *text; @property (nonatomic, strong) UIView *inputAccessoryView; // You must override inputAccessoryView , since it readonly by default @end
В вашем .m файле выполните протокол:
- (BOOL)canBecomeFirstResponder { return YES; } - (BOOL)hasText { return [self.text length]; } - (void)insertText:(NSString *)text { NSString *selfText = self.text ? self.text : @""; self.text = [selfText stringByAppendingString:text]; [[NSNotificationCenter defaultCenter] postNotificationName:kInputObjectTextDidChangeNotification object:self]; } - (void)deleteBackward { if ([self.text length] > 0) self.text = [self.text substringToIndex:([self.text length] - 1)]; else self.text = nil; [[NSNotificationCenter defaultCenter] postNotificationName:kInputObjectTextDidChangeNotification object:self]; }
Предположим, вы хотите вызвать клавиатуру в -viewDidAppear:
, код будет выглядеть следующим образом:
- (void)viewDidLoad
{
[super viewDidLoad];
// inputObject and textField are both your ivars in your view controller
inputObject = [[InputObject alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
textField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
inputObject.inputAccessoryView = textField;
[self.view addSubview:inputObject];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(inputObjectTextDidChange:) name:kInputObjectTextDidChangeNotification object:nil];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[inputObject becomeFirstResponder]; // This will summon the keyboard
}
Затем выполните селектор уведомлений в контроллере вида:
- (void)inputObjectTextDidChange:(NSNotification *)notification
{
// Just set the text here. notification.object is actually your inputObject.
textField.text = ((InputObject *)(notification.object)).text;
}
Это, вероятно, то, что вы подразумеваете под ", установите inputAccessoryView без первоначального UITextField"
- Другим обходным решением является позволить textField "притворяться"
inputAccessoryView
, тщательно упорядочив его анимацию. Но для этого решения ваш текстовый фильтр должен быть первым ответчиком.
Во-первых, вы наблюдаете события клавиатуры в своем -viewDidLoad
:
- (void)viewDidLoad
{
[super viewDidLoad];
// Init the textField and add it as a subview of self.view
textField = [[UITextField alloc] init];
textField.backgroundColor = [UIColor redColor];
[self.view addSubview:textField];
// Register keyboard events
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShowNotification:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHideNotification:) name:UIKeyboardWillHideNotification object:nil];
}
Во-вторых, установите фрейм вашего textField
в -viewWillAppear:
, чтобы гарантировать, что его фрейм не будет влиять на автоматизацию:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
textField.frame = CGRectMake(0, CGRectGetMaxY(self.view.bounds), CGRectGetWidth(self.view.bounds), 50);
}
А затем расположите анимацию textField
и позвольте ей синхронизироваться с анимацией клавиатуры. Селектора уведомлений клавиатуры могут быть такими:
- (void)keyboardWillShowNotification:(NSNotification *)notification
{
NSDictionary *userInfo = notification.userInfo;
UIViewAnimationCurve curve = [[userInfo valueForKey:UIKeyboardAnimationCurveUserInfoKey] intValue];
CGFloat duration = [[userInfo valueForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue];
CGRect keyboardFrame = [[userInfo valueForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
keyboardFrame = [self.view convertRect:keyboardFrame toView:self.view];
[UIView animateWithDuration:duration delay:0.0f options:(UIViewAnimationOptions)curve animations:^{
CGRect textFieldFrame = textField.frame;
textFieldFrame.origin.y = keyboardFrame.origin.y - CGRectGetHeight(textFieldFrame);
textField.frame = textFieldFrame;
}completion:nil];
}
- (void)keyboardWillHideNotification:(NSNotification *)notification
{
NSDictionary *userInfo = notification.userInfo;
UIViewAnimationCurve curve = [[userInfo valueForKey:UIKeyboardAnimationCurveUserInfoKey] intValue];
CGFloat duration = [[userInfo valueForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue];
[UIView animateWithDuration:duration delay:0.0f options:(UIViewAnimationOptions)curve animations:^{
textField.frame = CGRectMake(0, CGRectGetMaxY(self.view.bounds), CGRectGetWidth(self.view.bounds), 50);
}completion:nil];
}
Наконец, вызовите [textField becomeFirstResponder]
, чтобы запустить анимацию.