在項目開發中,遇到個很奇怪的問題, 在iOS系統自帶的九宮格鍵盤下,UITextView
控件的- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
代理方法會調用屢次測試
項目須要實現的是@
功能,當檢測到輸入的單個字符是@
時,跳出@ Controller 的控制器,選中後又跳回界面spa
問題緣由多是因爲九宮格下,輸入的第一個字符不是@
字符,當再次選擇@
符號時,會再次調用代理方法,將第一次輸入的替換掉代理
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { NSLog(@"%@", text); return yes; }
步驟:code
切換到九宮格鍵盤俠,輸入內容須要時`@`符
測試結果: 圖片
__注意:__此問題在第三方好比輸入法搜狗以及系統的全鍵盤下都不會出現此問題, 只有在系統九宮格下才會出現此問題開發
我採用的辦法就是藉助一個boolean值 _view_show
,當爲_view_show
爲 false 而且輸入的字符是@
的時候,進行跳轉,當爲true的時候不作任何處理,當跳轉進界面後設置爲true, 當再次回到這個界面時設置爲false it
知足條件io
輸入的字符必須是 @
class
_view_show
必須爲falseList
僞代碼
-(void) viewDidAppear{ [super viewDidAppear]; _show_view = false; } //代理方法中的判斷邏輯 if ([text isEqualToString:@"@"] && _view_show == false) { //具體的條換邏輯操做 _view_show = true; }
項目具體實現代碼
//爲了解決代理方法調用屢次的問題 -(void)chatView:(ALNChatView *)chatView replacementTextWithAtText:(NSString *)text { if(_conversation.conversationType != ConversationType_GROUP) return; if ([text isEqualToString:@"@"] && _view_show == false) { __weak __typeof(self) weakSelf = self; ViewController *selectedVC = [[ViewController alloc]init]; selectedVC.dataSourceArray = _groupMemberListArray; selectedVC.saveButtonActionBlock = ^(NSArray *arr){ //block 操做後的, 與此處問題無關 } }; //關鍵步驟 _view_show = true; [self.navigationController pushViewController:selectedVC animated:YES]; } }