dismisskeyboard close iphone ios uitableview uibutton uitapgesturerecognizer

iphone - close - uitapgesturerecognizer swift 4



no se puede hacer clic en UIButton dentro de una celda en UITableview (9)

Crea una UITableViewCell personalizada. Consulte este enlace .

Digamos que tienes un UIButton con el nombre de displayButton, puedes hacer algo como esto:

Dentro de su - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath , después de crear su celda,

[cell.dislayButton addTarget: self action: @selector(replyButtonPressed:withEvent:) forControlEvents: UIControlEventTouchUpInside];

Y crea el método como tal en tu ViewController:

- (void) replyButtonPressed: (id) sender withEvent: (UIEvent *) event { UITouch * touch = [[event allTouches] anyObject]; CGPoint location = [touch locationInView: self.tableView]; NSIndexPath * indexPath = [self.tableView indexPathForRowAtPoint: location]; }

Ya busqué algunas soluciones posibles, pero no todas resolvieron las mías.

sigo haciendo clic en la celda en la vista de uitable en lugar de los botones dentro de ella.

aquí está mi código:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath{ static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; } cell.backgroundColor = [UIColor blackColor]; UIView *v = nil; NSArray *array = [cell subviews]; for (v in array) { NSLog(@"%@",[v class]); if( [v isKindOfClass:[UIView class]] ){ [v removeFromSuperview]; } } //tb if (tableView == self.tb) { v = [[UIView alloc] initWithFrame: CGRectMake(0, 0, self.tb.bounds.size.width, 120.0)]; if([feeds count]>0){ UIImageView *box=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"statusBox.png"]]; box.userInteractionEnabled = YES; [v addSubview:box]; AsyncImageView *imageView1 = [[AsyncImageView alloc] initWithFrame:CGRectMake(10, 20.0f, 34.0f, 34.0f)]; imageView1.contentMode = UIViewContentModeScaleAspectFill; imageView1.clipsToBounds = YES; //cancel loading previous image for cell [[AsyncImageLoader sharedLoader] cancelLoadingImagesForTarget:imageView1]; if (users1 != nil && users1.imagelink != nil && (id) users1.imagelink != [NSNull null]){ imageView1.imageURL = [NSURL URLWithString:users1.imagelink]; } else{ imageView1.image=[UIImage imageNamed:@"default_ProfilePic.png"]; } UITapGestureRecognizer *tapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myFunction:)]; tapped.numberOfTapsRequired = 1; [imageView1 addGestureRecognizer:tapped]; [tapped release]; imageView1.userInteractionEnabled = NO; [v addSubview:imageView1]; UIFont *font = [UIFont fontWithName:@"TrebuchetMS-Bold" size:11]; UILabel *descLabel1 = [[UILabel alloc] initWithFrame: CGRectMake(52, 23, 160, 48)]; descLabel1.text = [NSString stringWithFormat:@"%@ %@",users1.userfirstn,users1.userlastn]; descLabel1.textColor = [UIColor blackColor]; descLabel1.font = font; descLabel1.adjustsFontSizeToFitWidth=YES; descLabel1.numberOfLines = 0; CGSize expectedLabelSize = [descLabel1.text sizeWithFont:descLabel1.font constrainedToSize:descLabel1.frame.size lineBreakMode:UILineBreakModeWordWrap]; CGRect newFrame = descLabel1.frame; newFrame.size.height = expectedLabelSize.height; descLabel1.frame = newFrame; descLabel1.numberOfLines = 0; descLabel1.userInteractionEnabled = NO; [v addSubview:descLabel1]; UILabel *descLabel2= [[UILabel alloc] initWithFrame: CGRectMake(52, 43, 200, 48)]; StatusClass *stat1=[feeds objectAtIndex:indexPath.row]; descLabel2.text = [stat1 statcreate]; descLabel2.textColor = [UIColor blackColor]; descLabel2.font = font; descLabel2.adjustsFontSizeToFitWidth=YES; descLabel2.numberOfLines = 0; CGSize expectedLabelSize2 = [descLabel2.text sizeWithFont:descLabel2.font constrainedToSize:descLabel2.frame.size lineBreakMode:UILineBreakModeWordWrap]; CGRect newFrame2 = descLabel2.frame; newFrame2.size.height = expectedLabelSize2.height; descLabel2.frame = newFrame2; descLabel2.numberOfLines = 0; descLabel2.userInteractionEnabled = NO; [v addSubview:descLabel2]; UILabel *descLabel3= [[UILabel alloc] initWithFrame: CGRectMake(10, 63, 280, 80)]; StatusClass *stat=[feeds objectAtIndex:indexPath.row]; descLabel3.text = [stat stattext]; descLabel3.textColor = [UIColor blackColor]; descLabel3.font = font; descLabel3.adjustsFontSizeToFitWidth=YES; descLabel3.numberOfLines = 0; descLabel3.userInteractionEnabled = NO; [v addSubview:descLabel3]; //comment button UIButton *buttonC = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [buttonC addTarget:self action:@selector(sendComment:) forControlEvents:UIControlEventTouchUpInside]; [buttonC setImage:[UIImage imageNamed:@"comment.png"] forState:UIControlStateNormal]; buttonC.frame = CGRectMake(2, 160, 145, 35); buttonC.userInteractionEnabled = YES; [v addSubview:buttonC]; //share button UIButton *buttonS = [UIButton buttonWithType:UIButtonTypeRoundedRect]; buttonS.tag = indexPath.row; [buttonS addTarget:self action:@selector(sendShare:) forControlEvents:UIControlEventTouchUpInside]; [buttonS setImage:[UIImage imageNamed:@"share.png"] forState:UIControlStateNormal]; buttonS.frame = CGRectMake(150, 160, 140, 35); buttonS.userInteractionEnabled = YES; [v addSubview:buttonS]; } v.userInteractionEnabled = YES; [cell addSubview:v]; } return cell; }

También probé el UITapGestureRecognizer para los botones y aún no funcionaba.

Gracias.


El UITableViewCell está manejando todos los gestos por defecto. Establecer cell.selectionStyle = UITableViewCellSelectionStyleNone; para hacer que deshabilite el comportamiento predeterminado.


Su UIButton = ''offset se da como 160 y UIView''s altura UIView''s se da simplemente como 120. Cambie el desplazamiento y de UIButton''s y pruebe.


Estoy desconcertado por este problema ...

Logré solucionar este problema haciendo esto en un proyecto:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("RegCell", forIndexPath: indexPath) as! CustomCell cell.contentView.userInteractionEnabled = false // <<-- the solution return cell }

pero lo mismo no funcionó para un proyecto diferente. No tengo ni idea de porqué...


Me encontré con este problema, pero en mi caso no estaba relacionado con la vista de tabla, sino porque estaba usando subvistas en mi botón para el cual userInteractionEnabled era verdadero, estableciendo ese valor para falso (NO) para todas las subvistas del botón corregidas el problema para mí


Para Swift 3 y Storyboard

Para mí, tuve que habilitar el toque múltiple dentro de la vista de contenido y habilitar la interacción del usuario en todo: la vista de tabla, la celda de vista de tabla, la vista de contenido y UIButton. Estaba usando guiones gráficos.

También configuré mi celda de vista de tabla como una subclase.

Como no pude encontrar una respuesta aquí cuando estaba explorando el problema, publiqué otra pregunta sobre el desbordamiento de pila sobre esto. Puede ver mi código y descargar un proyecto con esto trabajando aquí: ¿No puede hacer clic en el botón dentro de UITableViewCell?


Hay otra posible causa de problemas como este, y es que UITableViewCells ahora tiene un contentView . Esto se puede y se colocará frente a otras vistas en las celdas de la vista de tabla personalizada para detectar toques y detectar la selección de celda. Al hacerlo, puede bloquear toques a cualquier punto de vista detrás de él. He notado especialmente esta molestia al crear celdas usando plumillas.

El medio aceptado para tratar con esto es garantizar que todas las subvistas no se agreguen a la misma celda de tabla, sino a su contentView . Esta es una propiedad de solo lectura que ajusta su propio marco bajo ciertas circunstancias, por ejemplo, cuando se desliza hacia los lados para revelar el botón Eliminar o durante el modo de edición. Por lo tanto, debe asegurarse de que los elementos que agregue a contentView tengan un tamaño inteligente y tengan el comportamiento correcto de cambio de tamaño.

También tenga en cuenta que al agregar celdas a contentView , usted mismo puede bloquear toques y así evitar que se seleccione la celda. Personalmente trato de no permitir la selección de celda en las tablas que contienen celdas con controles personalizados habilitados por el usuario. Solo conduce a confusión e interfaces incómodas. De hecho, estoy considerando seriamente reemplazar todas las UITableViews en mis proyectos futuros con UICollectionViews , que son mucho más adaptables.

-Ceniza


Tengo el mismo problema, y ​​de alguna manera descubrí mi error.
Después de cambiar las constraints con self(UITableViewCell) a las constraints con contentView of self(UITableViewCell) , el botón de mi celda se puede volver a hacer clic.


Estaba haciendo esto:

let plusButton: UIButton = { let v = UIButton() v.setImage(plusImg, for: .normal) v.tintColor = .dark v.translatesAutoresizingMaskIntoConstraints = false v.addTarget(self, action: #selector(plusButtonHandler), for: .touchUpInside) // adding targets here did not work return v }()

Y parece que invocar el método addTarget dentro del cierre no funcionó. Cuando factoré el método addTarget y lo coloqué en el inicializador, ¡todo funcionó!