1.输入相关的优化问题在大多数应用中,都有一个输入需求。面对众多用户,想法各异,输入的文字内容也千奇百怪。我们如何针对不同的输入优化输入体验?这里总结一下输入相关的问题,主要有:1.输入控件UITextField随键盘移动2.过滤输入内容3.响应式编程处理,去除体验不好的对话框,HUD提示4.中文输入2.输入法boxfollowsthekeyboard移动界面的搭建有两种方式,代码或者storyboard/xib。这两种方法具有相同的处理键盘移动的方法。这里推荐使用封装好的第三方框架:TPKeyboardAvoiding1。代码处理方法rootView使用了TPKeyboardAvoiding框架中的TPKeyboardAvoidingScrollViewInitialization。比如登录界面,LoginViewController(继承自UIViewController),处理方式如下:letrootView=TPKeyboardAvoidingScrollView(frame:self.view.bounds);//...//addallsubviewstorootView//...self.view.addSubview(rootView)代码搭建接口实现输入框随键盘移动,类TPKeyboardAvoidingScrollView需要作为根视图处理。2.Storyboard/xib的处理方法storyboard/xib比较好办,只需将viewcontroller的rootView设置为TPKeyboardAvoidingScrollView即可(1)选择controller的rootview(2)设置默认实例化类#p#三,常用basicsSettings1.常用的基本设置包括打开键盘,关闭键盘,指定键盘的输入类型,指定返回键的类型,比如下面的代码//打开键盘self.inputText.becomeFirstResponder()//关闭键盘self.inputText.resignFirstResponder()//指定键盘的输入类型self.inputText.keyboardType=UIKeyboardType.NumberPad//指定返回键的类型self.inputText.returnKeyType=UIReturnKeyType.Go2.通过代理过滤输入通过UITextField/UITextView的代理,可以更精确地控制输入,例如:过滤指定字符,禁止输入超过字符数等(1)UITextField代码如下://设置代理,可以根据实际情况设置代理,这里使用self指定self.textField.delegate=self//代理方法实现functextField(textField:UITextField,shouldChangeCharactersInRangerange:NSRange,replacementStringstring:String)->Bool{//禁止输入空格if(string==""){returnfalse}//回车后取消键盘if(string=="\n"){textField.resignFirstResponder()returnfalse}returntrue}(2)UITextView代码如下:/设置代理,可以根据实际情况设置代理,这里使用self指定self.textView.delegate=self//代理方法实现functextView(textView:UITextView,shouldChangeTextInRangerange:NSRange,replacementTexttext:String)->Bool{//禁止输入空格if(text=="""){returnfalse}//回车后取消键盘if(text=="\n"){textView.resignFirstResponder()returnfalse}returntrue}UITextField/UITextView可以通过代理方法实时检测用户输入的内容,方便输入约束。比如当输入超过10个字符时,禁止用户输入,但是这种体验不好,建议不要使用#p#4.响应编程处理,准确的提示信息1.如何优化输入信息的约束。一般直接向用户提示规则。例如:社交网络中用户昵称的输入:请输入1-8个字符作为昵称,不包括空格、回车、标点符号用户点击确定按钮后,检查输入的有效性,提示用户通过一个对话框(或者HUD)上面的处理方式很常见,可以满足基本需求但是,由于以下两个原因,我们不再使用上述设计:1.提示太多,大多数用户不会阅读。2.对话框和HUD提示比较生硬,容易让用户产生挫败感。在实际开发过程中,简化提示信息为Pleaseenter1-8characters。当用户主动输入空格、回车、标点等字符,或超出长度时,会主动提示用户输入信息,如下图所示。无输入,OK键禁用,只有少量提示有用信息输入合法,确认键启用输入非法,显示高亮错误,确认键禁用2。代码实现使用第三方框架ReactiveCocoa。首先,当用户输入时,实现下图提示和右图的功能(没有使用第三方框架,可以通过代理实现)@IBOutletweakvarnickTextField:UITextField!//文本输入框@IBOutletweakvarcheckResultShowImageView:UIImageView!//输入框右边的图片@IBOutletweakvarbutton:UIButton!@IBOutletweakvarhintLabel:UILabel!//文本框下方的提示文字overridefuncviewDidLoad(){super.viewDidLoad()//配置输入configInput()}uncconfigInput(){self.nickTextField.rac_textSignal().subscribeNext{(text)->Voidinif(text==nil||text.length==0){self.checkResultShowImageView.hidden=falsereturn}self.checkResultShowImageView.hidden=truevariimageName=""if(self.checkInputValidate()){imageName="ok.png"self.hintLabel.text=""}else{imageName="warning.png"self.hintLabel.text="exceeds\(text.length-8)个字符"}self.checkResultShowImageView.image=UIImage(named:imageName)}}funccheckInputValidate()->Bool{//输入条件检查,本例只检查字符长度letlength=(self.nickTextField.textasNSString).lengthreturnlength>0&&length<=8}函数实现如下:根据输入的合法性,设置按钮的enabled属性。这一步需要下载文件RAC语法支持文件。更详细地说,Swift支持ReactiveCocoafuncconfigButtonEnable(){RAC(self.button,"enabled")<~RACSignal.combineLatest([self.nickTextField.rac_textSignal()],reduce:{()->AnyObject!inreturnsself.checkInputValidate()})}#p#5。中文处理方法当有中文输入时,上面的字数检查是不准确的,如果通过输入法输入“我爱中国文化”6个字符时,self.nickTextField.text中的字符数为23,提示信息不正确。UITextView/UITextFiled有个markedTextRange属性,用来识别当前是否有选中的文本(选中的Text就是上图中未完成输入的状态),用这个原理解决中文类似的问题@IBOutletweakvarnickTextField:UITextField!@IBOutletweakvarcheckResultShowImageView:UIImageView!@IBOutletweakvarbutton:UIButton!@IBOutletweakvarhintLabel:UILabel!{super.viewDidLoad()self.nickTextField.delegate=selffilterInput()configBbuttonEnable()}funcfilterInput(){self.nickTextField.rac_textSignal().subscribeNext{(text)->Voidinif(self.nickTextField.markedTextRange!=nil){返回;}//这里可以添加去掉空格、标点符号等操作self.chineseText=textasNSStringif(text==nil||text.length==0){self.checkResultShowImageView.hidden=falsereturn}self.checkResultShowImageView.hidden=truevariimageName=""if(self.checkInputValidate()){imageName="ok.png"self.hintLabel.text=""}else{imageName="warning.png"self.hintLabel.text="超出\(text.length-8)characters"}self.checkResultShowImageView.image=UIImage(named:imageName)}}funccheckInputValidate()->Bool{//输入条件检查,本例只检查字符长度letlength=chineseText.lengthreturnlength>0&&length<=8}funcconfigButtonEnable(){RAC(self.button,"enabled")<~RACSignal.combineLatest([self.nickTextField.rac_textSignal()],reduce:{()->AnyObject!inif(self.nickTextField.markedTextRange==nil){返回self.checkInputValidate()}returnsself.button.enabled})}@IBActionfuncbuttonPressed(sender:AnyObject){println("------>\(self.chineseText)")}六、摘要输入是最耗时的移动应用如果处理不当很容易流失用户。这里有以下几点:1、不要直接向用户展示所有的约束信息,只展示对大部分用户有用的信息,当用户出错时再展示其他约束。提示2、尽量少用或不用对话框和HUD来提示错误。3、提示信息准确,如超过字符数等。一种提示是:超过***140个字符另一种是:超过n个字符,明显晚些或提示对用户更有价值4.不要擅自更改用户输入或粗暴地禁止用户输入
