2013-09-25 8 views
28

Ich habe programmgesteuert ein UITableView erstellt und UISwitch zu seiner Zelle Zubehöransicht hinzugefügt.IOS 7 - Wie bekomme ich den indexPath von der Schaltfläche in UITableViewCell platziert

Dies ist mein Code für UISwitch in Zelle Zubehör Ansicht in cellForRowAtIndexPath Methode.

UISwitch *accessorySwitch = [[UISwitch alloc]initWithFrame:CGRectZero]; 
[accessorySwitch setOn:NO animated:YES]; 
[accessorySwitch addTarget:self action:@selector(changeSwitch:) forControlEvents:UIControlEventValueChanged]; 
cell.accessoryView = accessorySwitch; 

Dies ist die Methode, die aufgerufen wird, nachdem auf die Schaltfläche geklickt wurde.

- (void)changeSwitch:(UISwitch *)sender{ 

    UITableViewCell *cell = (UITableViewCell *)[sender superview]; 

    NSIndexPath *indexPath = [self.filterTableView indexPathForCell:cell]; 
    NSLog(@"%ld",(long)indexPath); 

……………. My other code……. 
} 

Ich bin in der Lage, den Index Pfadwert in iOS 6 Aber in iOS 7 druckt es null zu drucken,

Fehle ich etwas in iOS 7 oder gibt es einen anderen Ansatz, um die indexPath zu bekommen iOS 7

Danke, Arun.

Antwort

61

NSLog(@"%ld",(long)indexPath); ist falsch dies die Zeigeradresse von indexPath gedruckt wird

try folgenden Codes

CGPoint center= sender.center; 
    CGPoint rootViewPoint = [sender.superview convertPoint:center toView:self.filterTableView]; 
    NSIndexPath *indexPath = [self.filterTableView indexPathForRowAtPoint:rootViewPoint]; 
    NSLog(@"%@",indexPath); 
+0

es ist auch Null drucken – Arun

+1

können Sie auch sender.center drucken? und rootViewPoint – lanbo

+0

Vielen Dank, es löste mein Problem. – Arun

4

können Sie Tags wie an jedem Schalter in cellForRowAtIndexPath Methode zuweisen

- (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); 
} 
+0

Aber ich brauche beide indexPath.row und indexPath.section in meinem Code. – Arun

1

Sie sind wahrscheinlich zu verbrennen, die Annahme, dass der Schalter des superview die tableViewCell sein wird. Vielleicht haben sie in iOS 7 die Hierarchie geändert, um eine Art visuellen Effekt zu erzielen. vielleicht ist dort eine neue Ansicht eingefügt.

Sie könnten möglicherweise Unterklasse UISwitch und geben Sie eine indexPath Eigenschaft. Dann in Ihrem cellForRowAtIndexPath, ordnen Sie es dort, so dass Sie eine Referenz haben.

6

mit der Wenn Sie Schaltfläche in der Zelle haben. Sie können Zelle erhalten, indem Sie superview aufrufen. Und dann kann Indexpath auf diese Weise erhalten.

(void)obButtonTap:(UIButton *)sender { 

    UITableViewCell *cell = (UITableViewCell *)sender.superview; 
    NSIndexPath *indexPath = [tableView indexPathForCell:cell]; 
} 
+0

Es funktioniert nicht in iOS 7 –

+0

Dies ist nicht iOS 7 abhängigen Mann ... überprüfen Sie Ihren Code möglicherweise Problem mit Ihrem Code. –

+0

iOS 7 änderte die Hierarchie http://StackOverflow.com/Questions/19162725/Access-IOS-7-Hidden-Upgradeviewcellscrollview –

0

Ich denke, dass es gefährlich ist, sich auf die Position des Knopfes zu verlassen, um zu wissen, welcher geklickt wurde.

I prefere ein Wörterbuch erstellen, die als Schlüssel unter der Taste/selbst schalten, und als Wert der indexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
... 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    NSValue * accessorySwitchKey = [NSValue valueWithNonretainedObject:[cell settingSwitch]]; 
    [[self switchIndexDictionary]setObject:indexPath accessorySwitchKey]; 
... 
} 

dann, wenn der Schalter/Taster ich die indexPath leicht von meinem Wörterbuch ausgelöst wird, erhalten:

- (void)toggleSetting:(id)sender 
{ 
    UISwitch *selectedSwitch = (UISwitch *) sender; 

    NSValue * accessorySwitchKey = [NSValue valueWithNonretainedObject:selectedSwitch]; 
    NSIndexPath *indexPath = [[self switchIndexDictionary]objectForKey: accessorySwitchKey]; 
} 
5

Swift Lösung: A UITableView Erweiterung wie dieser kann das sinnvoll sein.

extension UITableView { 
    func indexPathForView(view: AnyObject) -> NSIndexPath? { 
     let originInTableView = self.convertPoint(CGPointZero, fromView: (view as! UIView)) 
     return self.indexPathForRowAtPoint(originInTableView) 
    } 
} 

Die Nutzung wird überall einfach.

let indexPath = tableView.indexPathForView(button) 
0

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 
    } 
} 
Verwandte Themen