在键盘可见时,iOS按钮点击不会触发?

问题描述:

我有一个很奇怪的问题,里面有UITableViewUIButtons在键盘可见时,iOS按钮点击不会触发?

我的表格包含3个部分,每个部分有1个原型单元格。最后一个类型包含4个按钮(其中2个触发连接到Web服务的过程,并触发segue进入下一页)。我也有UITextField第一类UITableViewCell

我的逻辑工作正常,除了一种情况 - 当我在里面编辑和我的键盘是可见的 - 我滚动(不退出编辑模式)。当我按下两个按钮中的一个时,我只能退出编辑模式 - 按钮的轻击不会被触发。

任何想法,可能是原因?

我拦截Gesture Recognizer,但视图的标记是0--无论我将它设置为-1300。我使用的代码:

UIView *view = gestRecognzr.view; 
NSLog(@"%d", view.tag);//By tag, you can find out where you had tapped. 

我说明键盘使用的通知和下面的代码:

// Add code for keyboard management 
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(keyboardShow:) 
              name:UIKeyboardWillShowNotification 
              object:nil]; 
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(keyboardHide:) 
              name:UIKeyboardWillHideNotification 
              object:nil]; 

......还有......

// ------------------------------------------------------ 

#pragma mark keyboard visual management 
// ------------------------------------------------------ 

- (void) keyboardShow: (NSNotification*) n { 

    if (!keyboardIsVisible){ 
     self->_oldContentInset = self.tvPayments.contentInset; 
     self->_oldIndicatorInset = self.tvPayments.scrollIndicatorInsets; 
     self->_oldOffset = self.tvPayments.contentOffset; 

     NSDictionary* d = [n userInfo]; 
     CGRect r = [[d objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; 
     r = [self.tvPayments convertRect:r fromView:nil]; 
     CGRect f = self.fr.frame; 
     CGFloat y = 
     CGRectGetMaxY(f) + r.size.height - 
     self.tvPayments.bounds.size.height + 5; 
     if (r.origin.y < CGRectGetMaxY(f)) { 
      NSNumber* duration = d[UIKeyboardAnimationDurationUserInfoKey]; 
      NSNumber* curve = d[UIKeyboardAnimationCurveUserInfoKey]; 
      [UIView animateWithDuration:duration.floatValue 
            delay:0 
           options:curve.integerValue << 16 
          animations:^{ 
           CGRect b = self.tvPayments.bounds; 
           b.origin = CGPointMake(0, y); 
           self.tvPayments.bounds = b; 
          } completion: nil]; 
     } 
     UIEdgeInsets insets = self.tvPayments.contentInset; 
     insets.bottom = r.size.height; 
     self.tvPayments.contentInset = insets; 
     insets = self.tvPayments.scrollIndicatorInsets; 
     insets.bottom = r.size.height; 
     self.tvPayments.scrollIndicatorInsets = insets; 

     keyboardIsVisible = YES; 
    } 
} 

- (void) keyboardHide: (NSNotification*) n { 

    if (keyboardIsVisible){ 
     NSNumber* duration = n.userInfo[UIKeyboardAnimationDurationUserInfoKey]; 
     NSNumber* curve = n.userInfo[UIKeyboardAnimationCurveUserInfoKey]; 
     [UIView animateWithDuration:duration.floatValue 
           delay:0 
          options:curve.integerValue << 16 
         animations:^{ 
          CGRect b = self.tvPayments.bounds; 
          b.origin = self->_oldOffset; 
          self.tvPayments.bounds = b; 
          self.tvPayments.scrollIndicatorInsets = self->_oldIndicatorInset; 
          self.tvPayments.contentInset = self->_oldContentInset; 

         } completion:nil]; 

     keyboardIsVisible = NO; 
    } 
} 
// ------------------------------------------------------ 

......还有......

/* Tap recognizer */ 
-(void)tap:(UIGestureRecognizer *)gestRecognzr 
{ 
    @try { 

     gestRecognzr.cancelsTouchesInView = NO; 

     [self.view endEditing:YES]; 

     UIView *view = gestRecognzr.view; 
     NSLog(@"%d", view.tag);//By tag, you can find out where you had tapped. 

    } 
    @catch (NSException *exception) { 
     [self throwUnknownException:exception]; 
    } 
} 

-(BOOL) textFieldShouldReturn:(UITextField *)textField{ 

    [textField resignFirstResponder]; 
    return YES; 
} 

- (BOOL)textFieldShouldBeginEditing:(PEStfCustomTextField *)textField { 

    [textField startEditMode:YES]; 
    return YES; 
} 

- (BOOL)textFieldShouldEndEditing:(PEStfCustomTextField *)textField { 

    [textField endEditMode:YES]; 

    return YES; 
} 

- (BOOL)textField:(PEStfCustomTextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
    return [textField cycleEditMode:YES shouldChangeCharactersInRange:range replacementString:string]; 
} 

- (void)textFieldDidBeginEditing:(PEStfCustomTextField *)textField 
{ 


    if (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPad) { 

     UITextField *field = (UITextField*)textField; 
     _frameY = field.frame.origin.y; 
     _frameHeight = field.frame.size.height; 

     UIView *separatorView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth([UIScreen mainScreen].bounds), 1.0/[UIScreen mainScreen].scale)]; 
     separatorView.backgroundColor = [UIColor darkGrayColor]; 
     textField.inputAccessoryView = separatorView; 
    } 

    self.fr = textField; // keep track of first responder 
} 

- (void)textFieldDidEndEditing:(PEStfCustomTextField *)textField { 

    NSNumberFormatter *frmtr = [[NSNumberFormatter alloc] init]; 
    frmtr.numberStyle = NSNumberFormatterDecimalStyle; 
    NSNumber *myAmount = [frmtr numberFromString:textField.text]; 

    NSString *currAmount = textField.text; 
    int Amount; 

    if(([textField.text length] != 0) && (![myAmount isEqual:@0])) { 

     currAmount = [currAmount stringByReplacingOccurrencesOfString:constCharComma withString:constCharFullStop]; 
     Amount = [currAmount doubleValue] * 100.0; 

     textField.text = [singApp formatAmount:Amount]; 

    } 
    else 
    { 
     Amount = 0; 

     textField.text = @""; 
    } 

    long section = (textField.tag - 3000) % 10000; 
    long row = (textField.tag - 3000 - section)/10000; 


    [singApp.paymentInfo setItemRechargeAmount:Amount row:row section:section-1]; 

    UILabel *lbl = (UILabel *)[self.view viewWithTag:NSIntegerMax]; 

    long long bulletinsAmount; 
    long long rechargesAmount = [singApp.paymentInfo getTotalRechargesAmount]; 

    if (singApp.paymentInfo.isBulletinPaymentDenied) 
    { 
     bulletinsAmount = 0; 
    } 
    else 
    { 
     bulletinsAmount = (long long)[self getBulletinsAmount]; 
    } 

    lbl.text = [hdrTotal stringByReplacingOccurrencesOfString:@"{0}" withString:[singApp formatEuroAmount:(bulletinsAmount + rechargesAmount)]]; 
    isTotalZero = (bulletinsAmount + rechargesAmount == 0); 

} 

您需要实现UIGestureRecognizerDelegate和bypa如果视图是你的按钮,那么ss gesturerecognizer动作。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
    return (touch.view != yourButton); 
} 

访问https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIGestureRecognizerDelegate_Protocol/index.html#//apple_ref/occ/intfm/UIGestureRecognizerDelegate/gestureRecognizer:shouldReceiveTouch

+0

这不起作用 - 水龙头无法识别要在键进行。这是非常烦人的 - 有时它起作用,有时不起作用。我猜想键盘的显示是误导性的抽头位置。 – new2ios

+0

如果按钮意味着在底部,为什么你不把它们添加为章节页脚或tableviewfooter并尝试.. – sandy

+0

是的按钮是单独的UITableViewCell。 10倍,我会尝试。 – new2ios