UITextField becomeFirstReponder方法不起作用且返回false。
UITextField becomeFirstReponder方法不起作用且返回false。
我在代码中有3个文本字段的出口,如下所示:
@IBOutlet var oldPasswordTextField: UITextField! { didSet { oldPasswordTextField.delegate = self } }
@IBOutlet var newPasswordTextField: UITextField! { didSet { newPasswordTextField.delegate = self } }
@IBOutlet var confirmPasswordTextField: UITextField! { didSet { confirmPasswordTextField.delegate = self } }
在我的textFieldShouldReturn委托方法中,我希望在点击返回键时将下一个文本字段设置为第一个响应者,如下所示:
func textFieldShouldReturn(textField: UITextField) -> Bool { //委托方法
textField.resignFirstResponder()
if textField == oldPasswordTextField
{
newPasswordTextField.becomeFirstResponder()
}
else if textField == newPasswordTextField
{
confirmPasswordTextField.becomeFirstResponder()
}
else
{
saveButtonTapped()
}
return true
}
但它没有起作用。所以我试着检查出了什么问题。所以我尝试了这个:
func textFieldShouldReturn(textField: UITextField) -> Bool { //委托方法
if textField.canResignFirstResponder()
{
print("textField can resign first responder")
if textField.resignFirstResponder() == true
{
print("textField resigned first responder")
}
else
{
print("textField didnt resign first responder")
}
}
else
{
print("textField cant resign first responder")
}
if textField == oldPasswordTextField
{
if newPasswordTextField.canBecomeFirstResponder() == true
{
if newPasswordTextField.becomeFirstResponder() == true
{
print("newPassword field has become first responder")
}
else
{
print("newPassword field cannot become first responder")
}
}
}
else if textField == newPasswordTextField
{
confirmPasswordTextField.becomeFirstResponder()
}
else
{
saveButtonTapped()
}
return true
}
每次我在控制台上得到"textField cant resign first responder"和"newPassword field cannot become first responder"。我不知道出了什么问题。为什么canResignFirstResponder()方法和becomeFirstResponder()方法返回false?有什么帮助吗?
问题出现的原因是在调用`becomeFirstResponder()`方法时返回了false。这可能是由于找不到下一个响应者造成的。
解决方法是使用标签来标识文本字段,然后根据标签找到下一个响应者。如果找到了下一个响应者,则调用`becomeFirstResponder()`方法将焦点设置到下一个文本字段上。如果找不到下一个响应者,则调用`resignFirstResponder()`方法移除键盘。
下面是用Objective-C和Swift编写的示例代码:
Objective-C:
- (BOOL)textFieldShouldReturn:(UITextField *)textField { NSInteger nextTag = textField.tag + 1; // 尝试找到下一个响应者 UIResponder *nextResponder = [textField.superview viewWithTag:nextTag]; if (nextResponder) { // 找到下一个响应者,将焦点设置到下一个文本字段上 [nextResponder becomeFirstResponder]; } else { // 找不到下一个响应者,移除键盘 [textField resignFirstResponder]; } return NO; // 不希望UITextField插入换行符 }
Swift:
func textFieldShouldReturn(textField: UITextField!) -> Bool {
let nextTag = textField.tag + 1
// 尝试找到下一个响应者
if let nextResponder = textField.superview?.viewWithTag(nextTag) as UIResponder? {
nextResponder.becomeFirstResponder()
} else {
// 找不到下一个响应者,移除键盘
textField.resignFirstResponder()
}
return false // 不希望UITextField插入换行符
}
我在这里找到了解决方案:[Switching between Text fields on pressing return key in Swift](https://stackoverflow.com/questions/31766896)
希望这些解决方法能帮助你解决问题。如果`nextResponder.becomeFirstResponder()`返回false,请检查是否正确设置了标签,并确保找到了下一个响应者。