我很难过,我希望有人可以提供帮助。
我在segue之前调用所有五个文本字段的resign第一响应方法。 segue发生,如果键盘在segue之前可见,键盘仍然无论我做什么。这在IOS6中没有发生。它只发生在IOS7中。
非常感谢您的帮助。
以下是该方案:
用户每次触摸一个文本字段以输入数据。键盘在从第一个响应者从一个字段更改为下一个字段时没有问题,并且可以从“完成”按钮中退出而没有问题。当用户触摸将从选择器视图填充的字段时,问题就出现了。如果键盘在以前的某个文本字段中可见,则它不会消失。
我让这段代码在两个字段的resignFirstResponder
操作上尝试editingDidBegin
。我正在使用这两个字段来保存数字,但我会在下一个视图中从选择器填充它们。
- (IBAction)txtRatioOrHullTypeTouched:(id)sender
{
// Hide the keyboard before the segue to the picker occurs.
[self.txtPitch resignFirstResponder];
[self.txtRPM resignFirstResponder];
[self.txtSlipOrSpeed resignFirstResponder];
[self.txtRatio resignFirstResponder];
[self.txtHullType resignFirstResponder];
segueToPicker = YES; // Raise flag indicating that this segue is to the picker.
[self performSegueWithIdentifier:@"toPicker" sender:sender];
}
我也将同样的代码放在viewWillDisappear
中,如下所示:
- (void)viewWillDisappear:(BOOL)animated // Unchanged
{
// Hide the keyboard before the segue to the picker occurs.
[self.txtPitch resignFirstResponder];
[self.txtRPM resignFirstResponder];
[self.txtSlipOrSpeed resignFirstResponder];
[self.txtRatio resignFirstResponder];
[self.txtHullType resignFirstResponder];
[super viewWillDisappear:animated];
}
这两个方法都在初始视图ViewController.m文件中。
答案 0 :(得分:2)
我最终在这里删除导致问题的文本字段并用按钮替换它们。没有任何情况我试过(几十个)让这个代码在IOS7中按预期工作,即使它在IOS6中都完美无缺。
答案 1 :(得分:2)
我尝试了上述所有内容,只要我用一个按钮取消控制器就可以工作。按下按钮时调用的函数可以调用TextField的resignFirstResponder()函数,一切都很顺利。
但是,当执行边缘滑动以关闭控制器时,键盘会在下次显示时弹出。在我的代码中,我在视图之间重用相同的控制器。这可能不是明智的,但它很快乐!
在尝试了互联网编写的所有内容之后(不是真的,但非常接近)我发现我可以实现TextField的textViewShouldBeginEditing()并在ViewControllers ViewDidDisappear和ViewDidAppear之间返回false。这是ha hack,但是当没有其他工作时,它就成功了。
我希望这可以帮助你们!
Swift代码:
在我的ViewController中
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
myTextField.allowEdit = true
}
override func viewDidDisappear(animated: Bool) {
super.viewDidDisappear(animated)
myTextField.allowEdit = false
}
在我的TextField类中
class MyTextField: UIView, UITextFieldDelegate {
var allowEdit = true
func textFieldShouldBeginEditing(textView: UITextView) -> Bool {
return allowEdit
}
}
答案 2 :(得分:1)
您可以使用文本字段在视图控制器上调用endEditing:
。您的viewWillDisappear:
方法将如下所示:
- (void)viewWillDisappear:(BOOL)animated
{
[self.view endEditing:YES];
[super viewWillDisappear:animated];
}
答案 3 :(得分:1)
我认为由于您通过选择器离开视图的方式,而不通过退出,您需要在viewController中包含以下内容:
- (BOOL) disablesAutomaticKeyboardDismissal
{
return NO;
}
斯威夫特,2017年
override var disablesAutomaticKeyboardDismissal: Bool {
get { return false }
set { }
}
答案 4 :(得分:1)
贡献我2美分的价值。在 iOS 9.2 上正确解雇键盘,这是一个简约的样本,仅供参考。
...
@property (assign) BOOL isTransitioning;
...
-(void)viewWillAppear:(BOOL) animated {
self.isTransitioning = YES;
}
-(void)viewWillDisappear:(BOOL) animated {
self.isTransitioning = YES;
}
-(void)viewDidAppear:(BOOL) animated {
self.isTransitioning = NO;
}
-(void)viewDidDisappear:(BOOL) animated {
self.isTransitioning = NO;
}
-(BOOL) textViewShouldBeginEditing:(UITextView*) tv {
if (self.isTransitioning) {
return NO;
}
return YES;
}
答案 5 :(得分:0)
现在看来,控制键盘的文本字段不允许辞职。我在该字段上使用了canResignFirstResponder查询,结果(布尔值)为FALSE。我还注意到,即使在调用resignFirstResponder之后,我也在字段中获得了闪烁的光标。 - 拉里J 2013年10月25日23:32
我知道这已经过时了,但我遇到了类似的问题,想要分享对我有用的东西,以防它对其他人有所帮助:
在阅读上述评论后,我发现将[self.view endEditing:YES]
从我在 textFieldDidBeginEditing 中的位置移动到 textFieldSHOULDBeginEditing 为我做了诀窍。现在键盘在我的segue之前正确地解雇了。
答案 6 :(得分:0)
接受Zaheer对Swift的评论,这对我来说非常有效。
view.endEditing(true)
答案 7 :(得分:0)
这是我经常遇到的问题。我最好的应对方法是在键盘下方创建一个清除按钮,并让其调用解雇助手。通过切换其isHidden属性来控制清除按钮。轻敲键盘外的按钮将按下该清除按钮,然后呼叫解雇助手。它不会做的就是触发您的搜索,用户将需要再次轻按以进行导航,但该键盘将消失。
在viewDidLoad()中:
var clearButton: UIButton!
self.clearButton = UIButton(frame: self.view.frame)
self.clearButton.backgroundColor = .clear
self.clearButton.addTarget(self, action: #selector(self.dismissHelper(_:)), for: .touchUpInside)
self.view.addSubview(self.clearButton)
self.clearButton.isHidden = true
然后添加解雇助手:
func dismissHelper(_ sender: UIButton?) {
self.clearButton.isHidden = true
view.endEditing(true)
}
func displayClearButton(){
print("display clear button, hidden = false")
self.clearButton.isHidden = false
}
然后在您的文本字段上添加目标
self.textField.addTarget(self, action: #selector(self.displayClearButton), for: .editingDidBegin)