我与UITextField
并排UIButton
并具有发送功能。当用户按下发送按钮时,我正在执行简单的操作:
- (IBAction)sendMessage: (id)sender {
[self.chatService sendMessage: self.messageTextField.text];
self.messageTextField.text = @""; // here I get exception
}
现在当用户开始在键盘上使用听写时,然后在听写视图(键盘)上按下并立即按下发送按钮,我有异常“范围或索引越界”。
我注意到当语音识别服务器正在处理数据时,其他应用程序会禁用此“发送”按钮。这恰好在两个事件之间:用户按下“完成”,结果出现在文本字段中。我希望以同样的方式解决它。
我在文档中找到可以接收此通知的问题。我找到了UITextInput
协议,但这不是我需要的。
[UITextInputMode currentInputMode].primaryLanguage
等于@"dictation"
时禁用发送按钮。报告听写结束模式的通知UITextInputCurrentInputModeDidChangeNotification
在听写服务提交新值之前到达,我仍然可以单击发送按钮以引发异常。我可以在primaryLanguage
损失@“听写”值时增加延迟,但我不喜欢这种方法。很可能这种所需的延迟取决于语音识别服务的响应程度。UIControlEventEditingDidBegin
,UIControlEventEditingChanged
,UIControlEventEditingDidEnd
,UIControlEventEditingDidEndOnExit
)。好消息是,UIControlEventEditingChanged
看起来恰好在所需的时刻被激发:当用户在听写视图上按“完成”并且服务正在提交或结束听写时。所以这是我迄今为止最好的概念。 坏事是在其他情况下也会被触发,并且没有信息可以区分这种控制事件被触发的情况,所以我不知道应该禁用或启用按钮还是执行此操作什么都没有。答案 0 :(得分:6)
简单优雅将通过苹果审查,它始终工作。只需对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接受)。
答案 1 :(得分:1)
在iOS 7中,Apple推出了TextKit,因此有关此问题的新信息: NSAttachmentCharacter = 0xfffc 用于表示附件documentation表示。
因此,如果您的版本大于或等于 7.0 ,更好的方法是检查referencedString的附件。