2012-02-20 14 views
7

Voglio due interazioni su una cella di visualizzazione tabella: normale tocco e pressione prolungata. Ho usato la risposta alla seguente per aiutarmi a iniziare:premere a lungo il tasto sulla cella di visualizzazione tabella

Long press on UITableView

Il problema è che se faccio una lunga pressione su una cella valida, la cella evidenzierà blu, e il gesto pressione prolungata fa non sparare (pensa che sia solo un semplice tocco). Tuttavia, se avvio il gesto di pressione lunga su una cella non valida, quindi far scorrere il dito su una cella valida, quindi rilasciarlo, funziona perfettamente.

+1

Che cos'è una "cella non valida" secondo la tua definizione? – omz

+0

penso che la sua "cella senza bisogno" –

risposta

-2

Forse disattivare la selezione in IB o programatically

[cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 
+0

Questo semplicemente disabilita l'evidenziazione blu? – user1120008

+0

La mia teoria è che il tuo gesto di lunga pressione non scatta perché la cella è già evidenziata. Per favore, prova la mia proposta, non perderai nulla. –

+0

Non ho fortuna con questo approccio. – user1120008

23

probabilmente c'è una risposta migliore là fuori, ma qui è un modo per farlo:

Innanzitutto creare una pressione prolungata gesto riconoscitore sul tavolo vedere se stesso.

UILongPressGestureRecognizer* longPressRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(onLongPress:)]; 
[self.tableView addGestureRecognizer:longPressRecognizer]; 

Poi, maneggiarlo con una routine che riesce a trovare la riga selezionata:

-(void)onLongPress:(UILongPressGestureRecognizer*)pGesture 
{ 
if (pGesture.state == UIGestureRecognizerStateRecognized) 
{ 
    //Do something to tell the user! 
} 
if (pGesture.state == UIGestureRecognizerStateEnded) 
{ 
    UITableView* tableView = (UITableView*)self.view; 
    CGPoint touchPoint = [pGesture locationInView:self.view]; 
    NSIndexPath* row = [tableView indexPathForRowAtPoint:touchPoint]; 
    if (row != nil) { 
     //Handle the long press on row 
    } 
} 
} 

non l'ho provato, ma penso che si potrebbe tenere la riga dalla mostrando selezione facendo il gesto i riconoscitori nella visualizzazione tabella attendono che la lunga pressione fallisca.

2

Mi sono imbattuto nello stesso problema e ho trovato una buona soluzione. (almeno su iOS 7)

Aggiungi questo UILongPressGestureRecognizer alla cella stessa.

self.longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(onSelfLongpressDetected:)]; 
[self addGestureRecognizer:self.longPressGesture]; 

E 'strano ma importante a init con l'obiettivo di sé, e anche aggiungere il gestureRecognizer di nuovo per sé e il metodo onSelfLongpressDetected viene chiamato.

0

Ho avuto un problema vicino a questo. Per prima cosa ho provato ad aggiungere un gesto di pressione lunga a un UIView all'interno di una cella selezionabile e non ha funzionato. La soluzione era di aggiungere il gesto alla cella stessa, come è stato detto prima nella risposta di Fabio.

aggiunta la soluzione in rapida sotto:

let longPress = UILongPressGestureRecognizer.init(target: self, action: #selector(longPress(_:))) 
longPress.minimumPressDuration = 1.0 
cell.addGestureRecognizer(longPress) 

ho usato il codice sopra all'interno del metodo cellForRowAtIndexPath UITableViewDataSource.

Problemi correlati