通过这个板上人们的精彩帮助,我几乎为我的学生完成了我的应用程序!我能够在键盘上显示一个工具栏,它有一个前一个和下一个按钮。然后,我将按钮放在三个输入字段之间。
如果用户在第一个字段中开始,他们可以在所有字段之间来回切换,就像我认为他们使用prev / next按钮一样。但是,如果用户在文本字段3上,然后单击第一个字段,则按钮保持不变,然后无法正常工作。
-(void)keyboardWillShow:(id)sender{
if ([inputA isFirstResponder]) {
[nextButton setEnabled:YES];
[previousButton setEnabled:NO];
} else if ([inputB isFirstResponder]) {
[nextButton setEnabled:YES];
[previousButton setEnabled:YES];
} else if ([inputC isFirstResponder]) {
[nextButton setEnabled:NO];
[previousButton setEnabled:YES];
}
}
...循环浏览下一个文本字段
-(void)nextField:(id)sender{
if ([inputA isFirstResponder]) {
[inputB becomeFirstResponder];
[previousButton setEnabled:YES];
[nextButton setEnabled:YES];
} else if ([inputB isFirstResponder]) {
[inputC becomeFirstResponder];
[previousButton setEnabled:YES];
[nextButton setEnabled:NO];
} else if ([inputC isFirstResponder]) {
[inputB becomeFirstResponder];
[previousButton setEnabled:YES];
[nextButton setEnabled:YES];
}
}
...循环显示以前的文本字段
-(void)previousField:(id)sender{
if ([inputC isFirstResponder]) {
[inputB becomeFirstResponder];
[nextButton setEnabled:YES];
[previousButton setEnabled:YES];
} else if ([inputB isFirstResponder]) {
[inputA becomeFirstResponder];
[nextButton setEnabled:YES];
[previousButton setEnabled:NO];
} else if ([inputA isFirstResponder]) {
[inputB becomeFirstResponder];
[nextButton setEnabled:YES];
[previousButton setEnabled:YES];
}
}
在我的键盘代码中,上一个按钮调用previousField,下一个按钮调用nextField。我想当我使用keyboardWillShow时,我将不同的输入设置为第一响应者,但这只是在第一次运行时。
有没有办法在用户点击字段时成为第一个响应者?
答案 0 :(得分:1)
至于触发更新,UITextField
有一个委托方法-textFieldDidBeginEditing:
,您可以根据@mackworth的建议调用-setPrevNextButtons
。还有其他几种做类似事情的方法 - 有关详细信息,请参阅related delegate protocol。
例如,在文本字段的委托中尝试此控制代码:
- (void)textFieldDidBeginEditing:(UITextField *)textField {
if (textField == inputA || textField == inputB || textField == inputC)
[self setPrevNextButtons];
}
不言而喻,您必须为文本字段设置委托才能使其正常工作。
答案 1 :(得分:0)
我可以建议两件事:首先,干它:“不要重复自己”。只要您反复看到相同的代码,请将其移至方法。其次,你没有指定谁调用keyboardWillShow。检查你的nib,在EditingDidBegin上每个inputX调用它。所以更短的代码是:
-(void) setPrevNextButtons { //ensures that Prev/Next buttons are correct for current firstResponder
if ([inputA isFirstResponder]) {
[nextButton setEnabled:YES];
[previousButton setEnabled:NO];
} else if ([inputB isFirstResponder]) {
[nextButton setEnabled:YES];
[previousButton setEnabled:YES];
} else if ([inputC isFirstResponder]) {
[nextButton setEnabled:NO];
[previousButton setEnabled:YES];
}
}
-(void)keyboardWillShow:(id)sender{
[self setPrevNextButtons];
}
//goes through the different text fields
-(void)nextField:(id)sender{
if ([inputA isFirstResponder]) {
[inputB becomeFirstResponder];
}else if ([inputB isFirstResponder]) {
[inputC becomeFirstResponder];
}
[self setPrevNextButtons];
}
-(void)previousField:(id)sender{
if ([inputC isFirstResponder]) {
[inputB becomeFirstResponder];
} else if ([inputB isFirstResponder]) {
[inputA becomeFirstResponder];
}
[self setPrevNextButtons];
}
如果你觉得自己很棘手,你也可以这样做:
-(void) setPrevNextButtons {
[previousButton setEnabled: [inputB isFirstResponder] ||
[inputC isFirstResponder] ];
[nextButton setEnabled: [inputA isFirstResponder] ||
[inputB isFirstResponder] ];
}