2015-09-21 10 views
9

Ho una sottoclasse personalizzata UITableViewCell che contiene alcuni metodi IBAction cablati da un pennino.IBAzione all'interno di UITableViewCell non chiamata in iOS 9

In iOS 8 tutto funziona come previsto. Se l'utente tocca uno dei pulsanti, viene chiamato l'appropriato IBAction. Se l'utente tocca un qualsiasi altro punto della cella, viene chiamato lo UITableView didSelectRowAtIndexPath.

In iOS 9, i miei metodi IBAction non vengono mai chiamati. UITableViewdidSelectRowAtIndexPath viene sempre generato indipendentemente da dove l'utente tocca la cella (pulsante o meno).

Il progetto è compilato in Xcode 6/Swift 1.2.

Ho trovato questo post su un forum Apple senza soluzione. Sembrano avere lo stesso problema.

https://forums.developer.apple.com/thread/16179

risposta

22

ho capito la soluzione, si spera questa risposta salverà qualcun altro il tempo.

Ho ereditato questo codice e aveva alcuni problemi. Gli UITableViewCell's che non funzionavano con iOS 9 non utilizzavano i pennini UITableViewCell con uno ContentView. Invece, qualcuno ha creato un pennino UIView e lo ha indirizzato a una sottoclasse personalizzata UITableViewCell. I pennini non avevano uno ContentView e apparentemente iOS 9 è un po 'più schizzinoso a riguardo. Questa implementazione funzionava perfettamente con iOS 8 e non c'erano errori di compilazione o di runtime o avvisi.

La soluzione era creare una nuova sottoclasse UITableViewCell e consentire a Xcode di crearne automaticamente il pennino. Quindi ho copiato tutta l'interfaccia utente e il codice dal vecchio pennino e l'ho incollato nello ContentView del nuovo pennino. Ho quindi dovuto sistemare i vincoli e ricablare le connessioni alla sottoclasse personalizzata.

+6

Oppure aggiungi UITableViewCell dalla libreria di oggetti nello stesso file xib, copypaste/relayout/relink IBOutlets/set base class, quindi rimuovi la vecchia visualizzazione. – jki

+1

Grazie per questo! Davvero frustrante. –

+1

Grazie mille per la condivisione. Ho perso tutto il mio giorno su questo finché non ho visto la tua risposta. – user3144836

3

Basta aggiungere questa linea in modo tableViewCellForRowAtIndexPath

cell.contentView.userInteractionEnabled = false; 
return cell; 

ma questo non è una soluzione adeguata.

iOS 9, inserisce una vista del contenuto in una cella tableView, anche se si utilizza una cella/xib personalizzata. La vista del contenuto viene aggiunta dopo la cella personalizzata, era su di essa.

per risolvere questo correttamente basta sostituire vista di cella custom/del XI ter con UITableViewCell dalla libreria di oggetti [da dove di solito si trascina & goccia UIButton, UILable, ecc ...];

+0

Questa è un'ottima soluzione se si desidera una soluzione rapida: stavo usando un framework di terze parti che non funzionava più.Tutto ciò che dovevo fare era disabilitare le userinterations nella contentview. in initWithCoder (era un file pennino). –