2011-07-28 57 views
3

我有以下代碼:UITapGestureRecognizer和自動校正

- (void)viewDidLoad 
{ 
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self 
            action:@selector(dismissKeyboard)]; 
    [self.view addGestureRecognizer:tap]; 
    tap.cancelsTouchesInView = NO; 
    tap.delegate = self; 
    [tap release]; 
} 

-(void)dismissKeyboard { 
    [self.textField resignFirstResponder]; 
} 

文本字段具有clearButton和自動校正功能。當我點擊clearButton時,一切正常,在UITextField被清除後鍵盤仍然出現。但是,當我不想接受建議的自動更正時,鍵盤消失,我的文本被建議的替換。

我需要UITapGestureRecognizer因爲我有一個UITableViewUITextField,所以當UITextField外的用戶點擊,我要辭職的鍵盤。

我該如何解決這個問題,以便可以在用戶需要時拒絕自動更正,並且鍵盤仍處於活動狀態?爲什麼在clearButton中可以正常工作,但在拒絕自動更正時不能正常工作?

編輯:它適用於clearButton,因爲它在UITextField內。因此,手勢沒有被觸發。但是,當點擊建議的文本更正時,它會被解僱......是否有方法檢查用戶是否單擊了建議的文本更正?

回答

1

這裏是手勢委託方法我已經實現輕敲藍自動更正文本時來解決這個問題:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{ 
    BOOL handleTouch = NO; 
    UIView *v = [self.view hitTest:p withEvent:nil]; 
    Class autocorrectionCancelClass = NSClassFromString(@"UIAutocorrectInlinePrompt"); 
    if(![v isKindOfClass:UIControl.class] && ![v isKindOfClass:autocorrectionCancelClass] && ![v isDescendantOfView:currentlyEditedTextView]) 
    { 
     handleTouch = YES; 
    } 

    return handleTouch; 
} 

在自動校正的抽頭取消按鈕,v是私有SDK類UIAutocorrectInlinePrompt的看法,但它也是編輯的UITextField/UITtextView的子視圖。

編輯:檢查類更好,因爲對於UITextFieldUIAutocorrectInlinePrompt視圖不是該字段的後代(在iOS 4.3 & 5.0上測試過)。問題是這個班可以重新命名爲私人班。

0

肯定的解決方案很好地工作,除了排除UIControl-s。 這裏是他的解決方案更清潔和更簡單的版本:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{ 
    return ![touch.view isKindOfClass:NSClassFromString(@"UIAutocorrectInlinePrompt")]; 
}