2011-01-23 117 views
3

我有一個UITextField,它是UIScrollView的子視圖 我有作爲UITextField的一部分存在一個輕擊手勢(或者更老的觸摸),使它成爲第一響應者。我想添加一個雙擊手勢到UITextField。爲了使這兩個手勢的互斥,我需要超載(儘管這不是正確的詞,因爲我不使用相同的名稱)單擊手勢。當我這樣做時,只要它調用的函數不會使UITextField成爲第一響應者,它就可以正常工作。如果它確實使文本字段成爲第一個響應者,那麼它第二次失敗時會調用.... wtf。所以,堆積一點幫助會有很大的幫助。UIGesture在IOS中未知原因失敗

這是我加手勢

UITapGestureRecognizer * singleTextTap = [[UITapGestureRecognizer alloc] 
      initWithTarget:self action:@selector(handleSingleTextTap:)];   
singleTextTap.numberOfTapsRequired = 1; 
[aTextField addGestureRecognizer:singleTextTap]; 

而這正是它被稱爲

//single tap text 
- (void) handleSingleTextTap:(UITapGestureRecognizer *)gestureRecognizer{ 
    NSLog(@"handling single tap"); 
    NSLog(@"textField gestures %@", 
      [gestureRecognizer.view.gestureRecognizers descriptionWithLocale:nil]); 
    [(UITextField *)gestureRecognizer.view becomeFirstResponder]; 
} 

您可能會注意到的NSLog說出來把註冊到文本框,這是檢查gestuers我的singleTextTap手勢的狀態。這是第一次'結束',所有下一次這個代碼永遠不會到達

回答

2

您看到的行爲是由於您每次發送becomeFirstResponder消息到UITextField都會導致它自己設置手勢識別器。如果你登錄[textField gestureRecognizers],你會看到它設置了很多。這些是爲了處理文本編輯功能,例如長按光標移動等。通過添加它們可以取消你設置的那些。處理這個問題的最簡單方法就是這樣的。

- (void) singleTap:(UITapGestureRecognizer*)singleTap { 
    if (![self.textField isFirstResponder]) { 
     [self.textField becomeFirstResponder]; 
     self.label.text = @"Single Tap -> Make First Responder"; 
     [self.label setNeedsDisplay]; 
    } 
} 
- (void) doubleTap:(UITapGestureRecognizer*)doubleTap { 
    if (![self.textField isFirstResponder]) { 
     [self.textField becomeFirstResponder]; 
     self.label.text = @"Double Tap -> Make First Responder"; 
     [self.label setNeedsDisplay]; 
    } 
} 

- (void) setupTextGestureRecognizers { 
    for (UIGestureRecognizer *rec in self.textField.gestureRecognizers) { 
     [self.textField removeGestureRecognizer:rec]; 
    } 
    UITapGestureRecognizer *singleTap = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)] autorelease]; 
    UITapGestureRecognizer *doubleTap = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTap:)] autorelease]; 
    [singleTap setNumberOfTapsRequired:1]; 
    [doubleTap setNumberOfTapsRequired:2]; 
    [singleTap setCancelsTouchesInView:YES]; 
    [doubleTap setCancelsTouchesInView:YES]; 
    [singleTap requireGestureRecognizerToFail:doubleTap]; 
    [self.textField addGestureRecognizer:singleTap]; 
    [self.textField addGestureRecognizer:doubleTap]; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self setupTextGestureRecognizers]; 
    self.textField.delegate = self; 
} 


- (BOOL) textFieldShouldReturn:(UITextField *)tf { 
    [tf resignFirstResponder]; 
    if (tf == self.textField) { 
     [self setupTextGestureRecognizers]; 
    } 
    return YES; 
} 

這是一個example project演示此代碼在使用中。

+1

這個答案給了我線索我需要解決我自己的問題。當點擊文本字段子視圖時,我忽略了一個點擊識別器。通過暫時禁用文本字段中的所有「gestureRecognizers」,我得到了我正在尋找的行爲,沒有不良副作用。 – phatmann 2014-05-05 20:13:32

1

你在做什麼似乎很奇怪,但無論如何。我會假設你知道你在做什麼。

你可以嘗試以下操作:

UITapGestureRecognizer *doubleTap = ...; 
UITapGestureRecognizer *singleTap = ...; 
[singleTap requireGestureRecognizerToFail:doubleTap]; 

這意味着,單輕叩識別只會火在雙擊一個不火,有效地使它們相互排斥。