故事是这样的: 前两天,产品提出了一个需求。一个页面有一个UITextField,有时可以输入,有时不可以输入,输入时有光标,但是不弹出键盘,用户点击输入框后再弹出键盘。因为在这个界面有很多东西,弹出键盘会影响用户的第一视觉效果!
最终效果
2016-10-26 13_17_14.gif需求听上去似乎很简单!
- 首先实现第一步:
进入界面是有光标,不弹出键盘
textField.inputView = UIView()
textField.becomeFirstResponder()
“完美!”
有一点点窃喜。。。
- 实现第二步,点击输入框后弹出键盘
方法1: 使用代理
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool
这个方法在textField
成为第一响应时就调用了,也不知道设置了哪个值,有光标后,再点击textField
不会响应了。只能pass
方法2:通知
网上有人说用通知试试,但是我觉得根本就没用,因为主要是获得点击的响应,也可能是我没有理解别人的思路。
方法3:添加一个action
textField.addTarget(self, action: #selector(action), for: .touchUpInside)
不能响应,具体原因也不知道
方法4:添加一个button在textField上
测试一下,响应是没有问题了,把textField.inputView = nil
,应该好了吧!点击按钮,键盘没有弹出?感觉原因大概是,在之前已经把textField.inputView = UIView()
设置了,导致覆盖了系统的键盘,UI已经构建好了再设置成nil,那个空view实际没有remove掉,网上说系统会监测inputView
,实际证明并没有。
已经折腾将近一上午了!
于是遗憾的告诉产品经理,这个需求暂时不能实现。(也可以画一个假的光标,但是会产生很多没用的代码,觉得没必要)。
就在今天早上,我想调用removeFromSuperview
这个方法,但是突然出现了reloadInputViews
这个方法,咦?感觉昨天那个事情能成啊!迅速打开昨天测试的项目,在textField.inputView = nil
下面加上textField.reloadInputViews()
。
网友评论