2013-09-25 10 views
6

Mam UITextFields w tableviewcells. Gdy przesuniesz palcem po komórce, która nie jest częścią pola tekstowego, akcja usuwania pojawia się zgodnie z oczekiwaniami. Jeśli przesuniesz palcem po polu tekstowym, zatrzyma usuwanie.Przesuń lewymi gestami ponad UITextField

Jak to naprawić, aby można było przesuwać dane wejściowe, a komórka uruchomi akcję usuwania?

+0

Czy rozwiązałeś ten problem? –

+0

Nie. Przeprojektowałem interfejs wokół problemu. –

+0

Spróbuj dodać - (void) tableView: (UITableView *) tableView commitEditingStyle: (UITableViewCellEditingStyle) editingStyle forRowAtIndexPath: (NSIndexPath *) indexPath. Działa kłamliwie. – Lightygalaxy

Odpowiedz

2

cancelsTouchesInView Myślę, że problemem jest to, że dotknięcie pola tekstowego koliduje z rozpoznawania gestów machnięcia (przypuszczalnie dołączony do widoku macierzystego). Miałem podobny problem z polem tekstowym umieszczonym w UIScrollView.

Usunąłem ten problem przez nałożenie wyraźnego UIView na mój UITextField. Następnie przypisałem UITapGestureRecognizer do tego przejrzystego widoku, aby ustawić pole tekstowe jako pierwszą odpowiedź, gdy użytkownik dotknie pola. W przeciwnym razie przesuwane jest wysyłane do widoku nadrzędnego (widok przewijania), który rozpoznaje przesunięcie bez żadnych problemów. To trochę kiepskie, ale działa.

Ten scenariusz jest nieco inny od twojego, ale myślę, że to ten sam problem. Oto co mój kod wygląda, mam nadzieję, że to pomaga:

// UIView subclass header 
@interface LSAddPageView : UIView 

@property (weak, nonatomic) IBOutlet UITextField *textField; // Connected to the UITextField in question 
@property (strong, nonatomic) UIView *textFieldMask; 
@property (assign, nonatomic) BOOL textFieldMaskEnabled; 

@end 

// UIView subclass implementation 
@implementation LSAddPageView 

- (void)awakeFromNib 
{ 
    [super awakeFromNib]; 

    _textFieldMask = [UIView new]; 
    _textFieldMask.backgroundColor = [UIColor clearColor]; 
    [self insertSubview:_textFieldMask aboveSubview:self.textField]; 
} 

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    _textFieldMask.frame = self.textField.frame; 
} 

- (BOOL)textFieldMaskEnabled 
{ 
    return _textFieldMask.hidden == NO; 
} 

- (void)setTextFieldMaskEnabled:(BOOL)textFieldMaskEnabled 
{ 
    _textFieldMask.hidden = !textFieldMaskEnabled; 
} 

@end 

A potem w kontrolerze:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    _addPageView = (LSAddPageView*)self.view; 

    _maskGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapMask:)]; 
    _maskGestureRecognizer.numberOfTapsRequired = 1; 
    _maskGestureRecognizer.numberOfTouchesRequired = 1; 
    [_addPageView.textFieldMask addGestureRecognizer:_maskGestureRecognizer]; 

    self.textField.delegate = self; // Set delegate to be notified when text field resigns first responder 
} 

- (void)didTapMask:(UIGestureRecognizer*)recognizer 
{ 
    _addPageView.textFieldMaskEnabled = NO; 
    [self.textField becomeFirstResponder]; 
} 

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField 
{ 
    _addPageView.textFieldMaskEnabled = YES; 
    return YES; 
} 
1

Brzmi jak trzeba ustawić właściwość

yourGestureRecognizer.cancelsTouchesInView = NO; 
+0

To nie działa dla mnie. –