我有UITextField与UIButton并排发送功能.当用户按下发送按钮时,我正在执行简单的操作:
- (IBAction)sendMessage: (id)sender { [self.chatService sendMessage: self.messageTextField.text]; self.messageTextField.text = @""; // here I get exception }
现在,当用户从键盘开始使用听写时,然后按下听写视图(键盘)并立即按下发送按钮,我有异常“范围或索引越界”.
可能的方法:
我注意到,当语音识别服务器处理数据时,其他应用程序会禁用此“发送”按钮.这恰好在两个事件之间:用户按下“完成”,结果出现在文本字段中.我希望以同样的方式解决它.
我在文档中找到可以收到此通知的问题.我找到了UITextInput协议,但这不是我需要的.
类似主题:
> Using Dictation – iOS 6 – DidStart – 解决方案不可接受(苹果可能拒绝)
> Disable Dictation button on the keyboard of iPhone 4S / new iPad – 与上述类似的方法
我试过了什么:
>简单地捕捉并忽略异常.崩溃没有确定,但虚拟键盘变得完全没有反应
>当[UITextInputMode currentInputMode] .primaryLanguage等于@“dictation”时禁用发送按钮.在听写服务提交新值之前报告听写结束模式的通知UITextInputCurrentInputModeDidChangeNotification到达,我仍然可以点击发送按钮导致异常.当primaryLanguage损失@“听写”值时,我可以增加延迟,但我不喜欢这种方法.最可能的是,这种所需的延迟取决于语音识别服务的响应程度.
>我在不同的事件上添加了一系列操作(这个evets正在寻找处理:UIControlEventEditingDidBegin,UIControlEventEditingChanged,UIControlEventEditingDidEnd,UIControlEventEditingDidEndOnExit).好处是看起来UIControlEventEditingChanged在所需的时刻完全被触发:当用户在听写视图上按“完成”并且服务提交或结束听写时.所以这是我迄今为止最好的概念.不好的是,在其他情况下这也被解雇了,并且没有信息可以区分这种控制事件被触发的情况,所以我不知道应该禁用或启用按钮或什么也不做.
它简单优雅将通过苹果审查,它始终工作.只需对UIControlEventEditingChanged做出反应,并检测出替换类型的存在,如下所示:
-(void)viewDidLoad { [super viewDidLoad]; [self.textField addTarget: self action: @selector(eventEditingChanged:) forControlEvents: UIControlEventEditingChanged]; } -(IBAction)eventEditingChanged:(UITextField *)sender { NSRange range = [sender.text rangeOfString: @"\uFFFC"]; self.sendButton.enabled = range.location==NSNotFound; }
老方法
Finlay我找到了一些解决方案.这是改进的概念nr 3,具有概念nr 2的混合(基于that answer).
-(void)viewDidLoad { [super viewDidLoad]; [self.textField addTarget: self action: @selector(eventEditingChanged:) forControlEvents: UIControlEventEditingChanged]; } -(IBAction)eventEditingChanged:(UITextField *)sender { NSString *primaryLanguage = [UITextInputMode currentInputMode].primaryLanguage; if ([primaryLanguage isEqualToString: @"dictation"]) { self.sendButton.enabled = NO; } else { // restore normal text field state self.sendButton.enabled = self.textField.text.length>0; } } - (IBAction)sendMessage: (id)sender { [self.chatService sendMessage: self.messageTextField.text]; self.messageTextField.text = @""; } - (BOOL)textFieldShouldReturn:(UITextField *)textField { if (self.textField.text.length==0 || !self.sendButton.enabled) { return NO; } [self sendMessage: textField]; return YES; } // other UITextFieldDelegate methods ...
现在问题没有出现,因为用户在可能发生时被阻止(恰好在用户按下听写视图上的“完成”按钮和结果来自语音识别服务之间.好处是使用公共API(只有@“听写”可能是一个问题,但我认为它应该被Apple接受).