iOS下UITextView等控件代理方法調用屢次解決辦法

iOS系統九宮格下代理方法調用屢次解決辦法

在項目開發中,遇到個很奇怪的問題, 在iOS系統自帶的九宮格鍵盤下,UITextView 控件的- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text代理方法會調用屢次測試

1. 需求背景

項目須要實現的是@功能,當檢測到輸入的單個字符是@ 時,跳出@ Controller 的控制器,選中後又跳回界面spa

2. 問題緣由設想

問題緣由多是因爲九宮格下,輸入的第一個字符不是@字符,當再次選擇@符號時,會再次調用代理方法,將第一次輸入的替換掉代理

測試代碼以及測試結果:
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
    NSLog(@"%@", text);
    return yes;
}

步驟:code

切換到九宮格鍵盤俠,輸入內容須要時`@`符

測試結果:
圖片描述圖片

__注意:__此問題在第三方好比輸入法搜狗以及系統的全鍵盤下都不會出現此問題, 只有在系統九宮格下才會出現此問題開發

3. 問題解決辦法

我採用的辦法就是藉助一個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];
        
    }
}
相關文章
相關標籤/搜索