在键盘可见时,iOS按钮点击不会触发?
问题描述:
我有一个很奇怪的问题,里面有UITableView
和UIButtons
。在键盘可见时,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);
}
这不起作用 - 水龙头无法识别要在键进行。这是非常烦人的 - 有时它起作用,有时不起作用。我猜想键盘的显示是误导性的抽头位置。 – new2ios
如果按钮意味着在底部,为什么你不把它们添加为章节页脚或tableviewfooter并尝试.. – sandy
是的按钮是单独的UITableViewCell。 10倍,我会尝试。 – new2ios