2013-10-29 11 views
5

Ich habe eine Sicht, die eine UITableView enthalten. Die Zellen dieses UITableView werden im Interface Builder erstellt, um verschiedene Arten von Zellen zu erhalten. So wird die Aktion jeder Schaltfläche in den folgenden Zellklassen verwaltet.Holen Sie die UITableViewCell indexPath mit benutzerdefinierten Zellen

- My UITableView verschiedene Arten von Zellen enthält:

enter image description here

- Die Header-Datei von meiner Klasse für Typ einer Zellen ("CellTypeOne.h"):

@interface CellTypeOne : UITableViewCell 
{ 
} 

- (IBAction)actionForFirstButton:(id)sender; 
- (IBAction)actionForSecondButton:(id)sender; 
- (IBAction)actionForThirdButton:(id)sender; 
- (IBAction)actionForFourthButton:(id)sender; 

- Die Header-Datei von meiner Klasse für Typ zwei Zellen ("CellTypeTwo.h"):

@interface CellTypeTwo : UITableViewCell 
{ 
} 

- (IBAction)actionForTheUniqueButton:(id)sender; 

- Die Ansicht, die meine Tabellenansicht ("ViewContainingMyTableView.h") enthalten :

@interface ViewContainingMyTableView : UIViewController <UITableViewDelegate, UITableViewDataSource> 
{ 
    UITableView *myTBV; 
} 

@property (retain, nonatomic) IBOutlet UITableView *myTBV; 

@end 

Hier ist die Sache, die ich tun möchte:

Wenn ich zum Beispiel auf die erste Schaltfläche in der ersten Zelle klicke, möchte ich in der Lage sein, den IndexPath der "aktuellen" Zelle anzuzeigen.

Zum Beispiel mag ich die folgende Ausgabe haben, wenn:

  • ich auf dem ersten Knopf klicken in der ersten Zelle: 0
  • ich in der ersten Zelle auf der dritten Schaltfläche klicken: 0
  • ich auf die erste und einzige Taste in der zweiten Zelle: 1
  • etc ...
+0

Haben Sie indexPath der Zelle auf Klick auf den Button benötigen? –

+0

Ja, ich brauche den IndexPfad der Zelle, die die angeklickte Schaltfläche enthalten. –

+0

@ Erzékiel einfach einen Delegaten in die benutzerdefinierte Zelle setzen und jedes Mal, wenn Sie auf die Schaltfläche in der benutzerdefinierten Zelle klicken, lösen Sie die Delegate-Methode zu ViewController in dort können Sie die Superview als Ihre benutzerdefinierte Zelle und erhalten Indexpfad der ausgewählten Zelle –

Antwort

10

seit Sie verwenden die benutzerdefinierte Zelle, ich denke, Sie müssen auch mit der Auswahl umgehen, weil Sie die Schaltfläche in der benutzerdefinierten Zelle berühren nicht die Zelle selbst daher TableView Delegate Methoden nicht ausgelöst werden, besser, wie ich in Ihrer benutzerdefinierten Zelle setzte eine Delegate-Methode für Beispiel in benutzerdefinierten Zellen

in Ihrem CellTypeOne.h diese

@synthesize delegate; //synthesize the delegate 

- (IBAction)actionForFirstButton:(UIButton *)sender 
{ 
    //add this condition to all the actions becz u need to get the index path of tapped cell contains the button 
    if([self.delegate respondsToSelector:@selector(touchedTheCell:)]) 
    { 
     [self.delegate touchedTheCell:sender]; 
     //or u can send the whole cell itself 
     //for example for passing the cell itself 
     //[self.delegate touchedTheCell:self]; //while at the defining the delegate u must change the sender type to - (void)touchedTheCell:(CellTypeOne *)myCell; if it shows any error in the defining of the delegate add "@class CellTypeOne;" above the defying the delegate 
    } 
} 

und in Ihrem ViewContainingMyTableView.h

@interface ViewContainingMyTableView : UIViewController <UITableViewDelegate, UITableViewDataSource ,TouchDelegateForCell1> //confirms to custom delegate like table delegates 
{ 
    UITableView *myTBV; 
} 

@property (retain, nonatomic) IBOutlet UITableView *myTBV; 

@end 

und in der ViewContainingMyTableView.m Datei

//@class CellTypeOne; //if u want t pass cell to controller 
@protocol TouchDelegateForCell1 <NSObject> //this delegate is fired each time you clicked the cell 
- (void)touchedTheCell:(UIButton *)button; 
//- (void) touchedTheCell:(CellTypeOne *)cell; //if u want t send entire cell this may give error add `@class CellTypeOne;` at the beginning 
@end 

@interface CellTypeOne : UITableViewCell 
{ 

} 
@property(nonatomic, assign)id<TouchDelegateForCell1> delegate; //defining the delegate 
- (IBAction)actionForFirstButton:(id)sender; 
- (IBAction)actionForSecondButton:(id)sender; 
- (IBAction)actionForThirdButton:(id)sender; 
- (IBAction)actionForFourthButton:(id)sender; 

in Ihrer CellTypeOne.m Datei hinzufügen

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    //during the creating the custom cell 
    CellTypeOne *cell1 = [self.aTableView dequeueReusableCellWithIdentifier:@"cell"]; 
    if(cell1 == nil) 
    { 
    cell1 = [[CustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; 
    } 
    cell.delegate = self; //should set the delegate to self otherwise delegate methods does not called this step is important 
} 

//now implement the delegate method , in this method u can get the indexpath of selected cell 

- (void)touchedTheCell:(UIButton *)button 
{ 
    NSIndexPath *indexPath = [self.aTableView indexPathForCell:(UITableViewCell *)button.superview]; 
    NSLog(@"%@",indexPath.description); 

} 
/* if u pass the cell itself then the delegate method would be like below 
- (void)touchedTheCell:(CellTypeOne *)myCell 
{ 
    NSIndexPath *indexPath = [self.aTableView indexPathForCell:myCell];//directly get the cell's index path 
    //now by using the tag or properties, whatever u can access the contents of the cell 
    UIButton *myButton = [myCell.contentView viewWithTag:1000]; //get the button 
    //... u can access all the contents in cell 
} 
*/ 

in Ihrem Fall ist dies für die erste Schaltfläche in der Zelle, mit unterschiedlichen Funktionen, die Delegatmethoden für jede Schaltflächen hinzufügen, wiederholen Sie die obigen Verfahren für weitere Tasten in der Zelle

Hoffnung u das bekommen :) hapy Codierung

+0

Ich gehe in touchedTheCell, also ist es eine gute Sache. Aber '[self.tbvTimeLine indexPathForCell: (UITableViewCell *) button.superview]' ist null ... –

+0

sollten Sie den Indexpfad erhalten, der für mich arbeitet –

+0

überprüfen Sie, indem Sie die Unterbrechungspunkte setzen –

0

Sie können das Tag innerhalb Ihrer xib in jeder Zelle verwenden, um sie zu unterscheiden.

Verwendung nach [self tag] innerhalb der Zelle Klasse

+0

Zellen sind dynamisch generiert ... Ich bevorzuge es, die Tags nicht zu verwenden. –

1

Mit iOS7 können Sie es wie folgt erhalten:

- (IBAction)actionForTheUniqueButton:(id)sender 
{ 
    YouCellClass *clickedCell = (YouCellClass*)[[sender superview] superview]; 
    NSIndexPath *indexPathCell = [self.tableView indexPathForCell:clickedCell]; 
} 
+0

Wie kann ich auf mein TableView verweisen? Weil es in einer anderen Ansicht ist, funktioniert 'self.myTableView' nicht. –

+0

Es funktioniert vielleicht, aber ich weiß nicht, wie ich auf meine TabelleVIEW verweisen soll. Ich versuche es, aber es funktioniert nicht: 'ViewContainingMyTableView * v = [[ViewContainingMyTableView alloc] init]; NSLog (@ "myTBV:% @", [p myTBV]); ' –

+0

In der Tat ... Das erste, was Sie tun können (und weil Sie Ihre eigene Klasse für Zellen erstellt haben), ist das Hinzufügen einer Eigenschaft in Ihrem Benutzerdefinierte Zellen, die sich auf die Tabelle beziehen Zeigen die Anzeige der Zelle an. Diese Lösung wird für diese Frage vorgeschlagen: http://stackoverflow.com/questions/1110482/reference-from-guidableviewcell-to-parent-uitableview – zbMax

0

Tableview IBOutlet in .h oder .m-Datei erstellen.Sie können die indexPath von ausgewählten Tablecell erhalten, indem innen ur actionForFirstButton mit: Methode

NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 

NSLog(@"I click on the first button in the first cell : %d", indexPath.row); 

bearbeitet: Verwendung Tag des Knopfs den Indexpfads zu erhalten, in Ihrer actionForFirstButton Methode

if(sender.tag == 0 || 1 || 2 || 3){ 
    { 
     NSLog(@"the cell is : %d", 0); 
    } 
    else if(sender.tag == 4){ 
    { 
     NSLog(@"the cell is : %d", 1); 
    } 
    else{ 
    NSLog(@"the cell is : %d", 2); 
    } 
+0

I bin mir nicht sicher, ob durch Berühren der Schaltfläche in einer Zelle die Zelle ausgewählt wurde ... – zbMax

+0

Wenn ich auf eine Schaltfläche klicke, ist die Zelle nicht in einem ausgewählten Zustand ... Das ist mein Problem! –

+0

Ich möchte nicht die Tags verwenden ... Sorry –

0

Ihre Anforderung ist nur die entsprechende Zeile Wert auf eine Schaltfläche, um wieder ...

Dann haben Sie eine sehr einfache Art und Weise,

@interface CellTypeOne : UITableViewCell 
{ 
    NSNumber *rowval; 
} 
@property (nonatomic,retain)NSNumber* rowval; 

gleiche Sache in Ihrem CellTypeTwo.h

@interface CellTypeTwo : UITableViewCell 
{ 
    NSNumber *rowval; 
} 
@property (nonatomic,retain)NSNumber* rowval; 

und jetzt in beide M-File Sie eine Methode für die Tasten definiert haben müssen, also mit in diesem Verfahren nur diese Zeile einfügen

NSLog(@"Number : %d",[rowval integerValue]); 

und within) Tableview cellForRowAtIndexPath: Methode fügen Sie diese Zeile zu

cell.rowval = [[NSNumber alloc]initWithInt:indexPath.row ]; 

Nun jedes Mal, wenn Sie eine Taste drücken verschiedener cel l es wird mit Zeilenwert der Zelle

Hoffnung antworten zurück, das wird helfen .. :-)

Verwandte Themen