J'ai créé par programme un UITableView et ajouté UISwitch à sa vue d'accessoire de cellule.
Ceci est mon code pour UISwitch dans la vue des accessoires de cellule dans la méthode cellForRowAtIndexPath
.
UISwitch *accessorySwitch = [[UISwitch alloc]initWithFrame:CGRectZero];
[accessorySwitch setOn:NO animated:YES];
[accessorySwitch addTarget:self action:@selector(changeSwitch:) forControlEvents:UIControlEventValueChanged];
cell.accessoryView = accessorySwitch;
C'est la méthode appelée après le clic sur le bouton.
- (void)changeSwitch:(UISwitch *)sender{
UITableViewCell *cell = (UITableViewCell *)[sender superview];
NSIndexPath *indexPath = [self.filterTableView indexPathForCell:cell];
NSLog(@"%ld",(long)indexPath);
……………. My other code…….
}
Je suis en mesure d'imprimer la valeur du chemin d'index sous iOS 6 Mais sous iOS 7, la valeur est nulle.
Est-ce que je manque quelque chose dans iOS 7 ou il existe une autre approche pour obtenir l'indexPath dans iOS 7
Merci, Arun.
NSLog(@"%ld",(long)indexPath);
est faux, cela affichera l'adresse du pointeur de indexPath
essayez d'utiliser les codes suivants
CGPoint center= sender.center;
CGPoint rootViewPoint = [sender.superview convertPoint:center toView:self.filterTableView];
NSIndexPath *indexPath = [self.filterTableView indexPathForRowAtPoint:rootViewPoint];
NSLog(@"%@",indexPath);
Swift solution: Une extension UITableView comme celle-ci peut être utile pour cela.
extension UITableView {
func indexPathForView(view: AnyObject) -> NSIndexPath? {
let originInTableView = self.convertPoint(CGPointZero, fromView: (view as! UIView))
return self.indexPathForRowAtPoint(originInTableView)
}
}
L'utilisation devient facile partout.
let indexPath = tableView.indexPathForView(button)
Si vous avez un bouton dans la cellule. Vous pouvez obtenir une cellule en appelant superview. Et puis peut obtenir Indexpath de cette façon.
(void)obButtonTap:(UIButton *)sender {
UITableViewCell *cell = (UITableViewCell *)sender.superview;
NSIndexPath *indexPath = [tableView indexPathForCell:cell];
}
Vous pouvez affecter des balises à chaque commutateur dans la méthode cellForRowAtIndexPath comme
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UISwitch *accessorySwitch = [[UISwitch alloc]initWithFrame:CGRectZero];
[accessorySwitch setOn:NO animated:YES];
[accessorySwitch addTarget:self action:@selector(changeSwitch:) forControlEvents:UIControlEventValueChanged];
cell.accessoryView = accessorySwitch;
accessorySwitch.tag = indexPath.row;
}
- (void)changeSwitch:(UISwitch *)sender{
NSIndexPath *indexPath = [NSIndexPath indexPathWithIndex:[sender tag]];
NSLog(@"%ld",(long)indexPath);
}
Swift 4:
extension UITableView {
func indexPathForView(view: AnyObject) -> NSIndexPath? {
let originInTableView = self.convert(CGPoint.zero, from: (view as! UIView))
return self.indexPathForRow(at: originInTableView)! as NSIndexPath
}
}
Swift 4 Conversion, crée une extension globale:
extension UITableView {
func indexPathForView(view: UIView) -> IndexPath? {
let originInTableView = self.convert(CGPoint.zero, from: (view))
return self.indexPathForRow(at: originInTableView)
}
}
Exemple d'utilisation:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = ...
cell.myButton.addTarget(self, action: #selector(myButtonAction(_:)), for: .primaryActionTriggered)
return cell
}
@objc func myButtonAction(_ button:UIButton) {
guard let ip = self.tableView.indexPathForView(view: button) else {
return
}
}
Vous êtes probablement en train de vous brûler, en supposant que la variable superview
du commutateur sera la tableViewCell
. Peut-être que dans iOS 7, ils ont modifié la hiérarchie pour obtenir un effet visuel; peut-être y a-t-il une nouvelle vue insérée dedans.
Vous pouvez éventuellement sous-classer UISwitch
et lui donner une propriété indexPath
. Puis, dans votre cellForRowAtIndexPath
, assignez-le afin que vous ayez une référence.
Je pense qu'il est dangereux de s'appuyer sur la position du bouton pour savoir lequel a été cliqué.
Je préfère créer un dictionnaire prenant comme clé le bouton/commutateur lui-même, et comme valeur le chemin index:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
...
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
NSValue * accessorySwitchKey = [NSValue valueWithNonretainedObject:[cell settingSwitch]];
[[self switchIndexDictionary]setObject:indexPath accessorySwitchKey];
...
}
puis quand le commutateur/bouton est déclenché, je récupère facilement le chemin index depuis mon dictionnaire:
- (void)toggleSetting:(id)sender
{
UISwitch *selectedSwitch = (UISwitch *) sender;
NSValue * accessorySwitchKey = [NSValue valueWithNonretainedObject:selectedSwitch];
NSIndexPath *indexPath = [[self switchIndexDictionary]objectForKey: accessorySwitchKey];
}