2010-03-19 17 views
13

Tengo una UITextView en una UITableViewCell personalizada. La vista de texto funciona correctamente (desplaza, muestra texto, etc.) pero necesito que los usuarios puedan tocar la celda de la tabla y acceder a otra pantalla. En este momento, si toca los bordes de la celda de la tabla (es decir, fuera de UItextView), se llama correctamente la siguiente vista. Pero claramente dentro de la vista de uitext, los toques se capturan y no se envían a la celda de la tabla.Cómo pasar el tacto de una UITextView a una UITableViewCell

Encontré una publicación que hablaba sobre la subclasificación de UITextView para reenviar los toques. Lo intenté sin suerte. La implementación está abajo. Me pregunto si tal vez a) el super de mi textview no es la celda de uitableview y por lo tanto necesito pasar el toque de otra manera ob) Si el super es la celda de uitableview si necesito pasar algo más? Cualquier ayuda sería muy apreciada.

#import "ScrollableTextView.h" 

@implementation ScrollableTextView 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    if (parentScrollView) { 
     [parentScrollView touchesBegan:touches withEvent:event]; 
    } 
    [super touchesBegan:touches withEvent:event]; 
} 

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { 
    if (parentScrollView) { 
     [parentScrollView touchesCancelled:touches withEvent:event]; 
    } 
    [super touchesCancelled:touches withEvent:event]; 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    if (parentScrollView) { 
     [parentScrollView touchesEnded:touches withEvent:event]; 
    } 
    [super touchesEnded:touches withEvent:event]; 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    if (parentScrollView) { 
     [parentScrollView touchesMoved:touches withEvent:event]; 
    } 
    [super touchesMoved:touches withEvent:event]; 
} 

- (BOOL)canBecomeFirstResponder { 
    return YES; 
} 

@end 

Respuesta

31

Trate [theTextView setUserInteractionEnabled:NO]; Si el usuario tiene que ser capaz de editar el contenido de la Vista de Texto, entonces es posible que tenga un problema de diseño aquí.

Swift 3: theTextView.isUserInteractionEnabled = false

Storyboard: marque la "Interacción usuario habilitado" casilla de verificación.

+1

Esto podría ser un poco viejo, pero tuve exactamente este mismo problema y esta línea lo resolvió. Gracias :) – gabaum10

+3

¡Muchas gracias! Por cierto, si alguien prefiere configurar esto en Interface Builder: abra el panel de atributos de UITextView en el inspector, desplácese hasta la parte inferior donde se encuentra el panel "Ver", y desmarque "User Interaction Enabled". – AndrewO

+3

El problema que tengo es que quiero que el usuario pueda tocar un número de teléfono, por ejemplo, pero aún así debo realizar la transición. Todavía estoy buscando la forma de hacer ambas cosas. Si alguien tiene cualquier sugerencia, por favor comunicármelo. Si descubro lo publicaré aquí. – DirectX

2

Sé que esta pregunta se ha formulado hace 5 años, pero el comportamiento todavía es muy necesario para que alguna aplicación tenga una celda en la que se pueda hacer clic con UIDataDetectors.

Así que aquí está la subclase UITextView me inventé para adaptarse a este comportamiento particular en un UITableView

-(id) initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:frame]; 
    if (self) { 
     self.delegate = self; 
    } 
    return self; 
} 

- (BOOL)canBecomeFirstResponder { 
    return NO; 
} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UIView *obj = self; 

    do { 
     obj = obj.superview; 
    } while (![obj isKindOfClass:[UITableViewCell class]]); 
    UITableViewCell *cell = (UITableViewCell*)obj; 

    do { 
     obj = obj.superview; 
    } while (![obj isKindOfClass:[UITableView class]]); 
    UITableView *tableView = (UITableView*)obj; 

    NSIndexPath *indePath = [tableView indexPathForCell:cell]; 
    [[tableView delegate] tableView:tableView didSelectRowAtIndexPath:indePath]; 
} 

- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange { 
    return YES; 
} 

Puede modificar este ajuste a sus necesidades ...

espero que ayude a alguien.

+0

solución inteligente. Aunque, cuando el usuario simplemente desplaza el 'UITextView', este código también activará el delegado, lo que no se espera. Liderando con su solución, se me ocurrió la mía, que puse en otra respuesta. –

+0

@IkhsanAssaat nunca tuvo ningún problema al desplazarse incluso cuando tocaste con cuidado el TextView con el dedo para iniciar el desplazamiento ... La única forma en mi aplicación de no deslizar y disparar es cuando haces clic en una URL presente en el TextView, pero aún es bueno tener más casos de estudio, para diferentes implementaciones, gracias. – TheSquad

1

El problema con su solución es que si coloca UITextView dentro de UITableViewCell, su supervisión no será la celda real. Incluso hay una pequeña diferencia entre iOS 7 e iOS 8 en la estructura de vista de la celda. Lo que debe hacer es desglosar (o profundizar) a través de la jerarquía para obtener la instancia UITableViewCell.

Estoy usando y modificando @ TheSquad while while para obtener el UITableViewCell y asígnelo a una propiedad. Luego anule esos métodos táctiles, use el método de toques de la celda cuando sea necesario y simplemente use las implementaciones del método táctil de super para obtener el comportamiento predeterminado.

// set the cell as property 
@property (nonatomic, assign) UITableViewCell *superCell; 

- (UITableViewCell *)superCell { 
    if (!_superCell) { 
     UIView *object = self; 

     do { 
      object = object.superview; 
     } while (![object isKindOfClass:[UITableViewCell class]] && (object != nil)); 

     if (object) { 
      _superCell = (UITableViewCell *)object; 
     } 
    } 

    return _superCell; 
} 

#pragma mark - Touch overrides 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    if (self.superCell) { 
     [self.superCell touchesBegan:touches withEvent:event]; 
    } else { 
     [super touchesBegan:touches withEvent:event]; 
    } 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    if (self.superCell) { 
     [self.superCell touchesMoved:touches withEvent:event]; 
    } else { 
     [super touchesMoved:touches withEvent:event]; 
    } 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    if (self.superCell) { 
     [self.superCell touchesEnded:touches withEvent:event]; 
    } else { 
     [super touchesEnded:touches withEvent:event]; 
    } 
} 

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { 
    if (self.superCell) { 
     [self.superCell touchesEnded:touches withEvent:event]; 
    } else { 
     [super touchesCancelled:touches withEvent:event]; 
    } 

} 
Cuestiones relacionadas