Voglio cambiare il controller di vista quando un pulsante viene premuto iphone
-
20-09-2019 - |
Domanda
Ho un controller della vista tabella con celle personalizzati. In quelle cellule ho aggiunto un pulsante per ogni una delle celle. Quello che vorrei è che quando si preme il pulsante che si visualizza una nuova vista con ulteriori informazioni su quella cella, diverso del parere che ottengo da didSelectRowAtIndexPath.
Lo so che è ora una domanda difficile. Ho visto che il pulsante ha una certa azione sul InterfaceBuilder (tocco verso il basso forse), ma come faccio a collegare a quale codice. dove dovrei dichiarare il codice che gestisce l'evento?
Ho postato in altre sedi senza risposta, spero che questo avrebbe funzionato.
Grazie. Gian
Soluzione
Io probabilmente sottoclasse UIButton di avere un'istanza di NSIndexPath. In questo modo, ogni individuo UIButton in un UITableViewCell può "conoscere", dove si trova in vista tabella, in modo che quando si preme il pulsante, è possibile chiamare un metodo che prende un NSIndexPath e spinge una nuova vista, simile a quello che si fa in -didSelectRowAtIndexPath:
ma con l'altra vista invece (forse dare un nome descrittivo come metodo di -didPressButtonAtIndexPath:
).
Invece di usare l'Interface Builder per fare questo, è necessario aggiungere un metodo per la sottoclasse UIButton sé che a sua volta chiama un metodo sul controller della vista. Poi, per ogni UIButton, è possibile utilizzare il metodo UIControl -addTarget:action:forControlEvents:
. Avere l'UIButton chiamare il proprio metodo, che chiama il metodo del controller. La soluzione potrebbe essere simile:
// MyButton.h
@interface MyButton : UIButton {
NSIndexPath *myIndexPath;
MyViewController *viewController;
}
- (void)didPressButton;
@end
// MyViewController.h
@interface MyViewController { }
- (void)didPressButtonAtIndexPath:(NSIndexPath *)indexPath;
@end
Poi, quando si genera le cellule, per ogni pulsante di chiamata si aggiunge:
[button addTarget:button
action:@selector(didPressButton)
forControlEvents:UIControlEventTouchDown];
E, infine, implementare -didPressButton
a guardare come:
- (void)didPressButton {
[controller didPressButtonAtIndexPath:myIndexPath];
}