2015-05-20 18 views
15

Ich habe eine UIViewController mit einer UITableView drin. Die Tabellenansicht enthält angepasste Zellen mit darin enthaltenen Textfeldern. Die Delegierten des Textfelds sind auf diese Klasse festgelegt.UITableViews didSelectRowAtIndexPath-Methode wird nicht aufgerufen

Auf Bearbeitung eines Textfelds (textFieldDidBeginEditing) habe ich eine Dropdown (UIView mit einem Tableview drin). Das Dropdown wird programmgesteuert erstellt. Das Problem, mit dem ich konfrontiert bin, ist, dass die didSelectRowAtIndexPath der Dropdown-Tabelle nicht aufgerufen wird. Ich habe den Delegaten, Datenquelle zu der Klasse richtig gesetzt. Ich habe auch alle anderen Gesten entfernt. Ich habe sichergestellt, dass die Tabellenansicht nicht im Bearbeitungsmodus ist.

Auf die Klicks von Zellen in der Dropdown-Liste, die einzige Sache, die funktioniert, ist die delegierten Methoden des Textfelds des Hintergrundtabellenfeldes.

//UITableView class(with textfield from where dropdown is loaded.) 
- (void)textFieldDidBeginEditing:(UITextField *)textField{ 

if(textField.tag == 3){ 
    if(dropDown == nil) { 
     CGFloat f = 200; 
     dropDown = [[SFTextFieldDropDown alloc] showDropDownWithSender:textField withHeight:f andElements:self.list]; 
     dropDown.delegate = self; 
     } 
    } 
} 

// Custom Drop down class. 
- (id)showDropDownWithSender:(UITextField *)senderTextField withHeight:(CGFloat)height andElements:(NSArray *)array{ 

    table = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, btn.size.width, 0)]; 
    table.delegate = self; 
    table.dataSource = self; 
    table.layer.cornerRadius = 5; 
    table.backgroundColor = [UIColor colorWithRed:0.239 green:0.239 blue:0.239 alpha:1]; 
    table.separatorStyle = UITableViewCellSeparatorStyleSingleLine; 
    table.separatorColor = [UIColor grayColor]; 
    [table setAllowsSelection:YES]; 
    table.frame = CGRectMake(0, 0, btn.size.width, *height); 
    [table setEditing:NO]; 
    [self addSubview:table]; 
} 
return self; 
} 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
return 1; 
} 

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
return 40; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
return [self.list count]; 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
static NSString *CellIdentifier = @"Cell"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    cell.textLabel.font = [UIFont systemFontOfSize:15]; 
    cell.textLabel.textAlignment = NSTextAlignmentLeft; 
    cell.selectionStyle = UITableViewCellSelectionStyleDefault; 
} 
if([list count] > 0) 
    cell.textLabel.text = [list objectAtIndex:indexPath.row]; 

return cell; 
} 
+1

Zeigen Sie Ihren Code .. –

+1

Bitte fügen Sie Ihren Code hier für eine bessere Bewertung hinzu –

+1

Haben Sie eine Geste zu Ihrer Ansicht hinzugefügt? –

Antwort

3

Ich denke, Ihre Berührungen durch UITextField einfügt und nicht weitergegeben an die unten Zelle empfangen werden. Was Sie tun müssen, ist zunächst textField.userInteractionEnabled = NO gesetzt, so dass Berührungen von Zelle empfangen werden.

Und dann dies zu tun:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    // get the reference to the text field 
    textField.userInteractionEnabled = YES; 
    [textField becomeFirstResponder]; 
} 
+0

Immer noch erfasst der Textfeld-Delegat den Klick. –

3

Von dem, was ich sehe Sie nicht Ihre Tableview bevölkern, ist es so einfach ist.

Wenn Sie es nicht ein Array geben und nicht aufrufen - reloadData, dann wird es nie die Delegate-Methoden aufrufen. (numberOfRowsInSection und cellForRowAtIndexPath)

+0

Ich bevölkere die Tabellenansicht. cellForRowAtIndexPath und andere Datenquellenmethoden funktionieren problemlos in der Dropdown-Klasse. Es sind die Klickereignisse, die nicht funktionieren. –

2

Von dem, was ich sehe, Sie sind nicht self.list auf das Array Einstellung erhalten in

- (id)showDropDownWithSender:(UITextField *)senderTextField 
        withHeight:(CGFloat *)height 
       andElements:(NSArray *)array 

self.list = array hinzufügen und das sollte es beheben

+0

Ich mache es. Nur dass ich diesen Teil des Codes nicht gepostet habe. Die Tabellenansicht ist zu Recht mit der Liste gefüllt. –

2

Also mit Ihrer Frage Erklärung, Sie haben insgesamt zwei UITableView in der Ansicht Ihres ViewControllers & mehrere UITextFields (wie textField, das das DropDown & aufruft das Dropdown selbst hat Textfelder in jeder Zeile.)

Also das Problem ist, die UITableView delegate ist auf die self gesetzt (das heißt, zwei UITableView delegieren zu einer Klasse. Also bei Erhalt didSelectRowAtIndexPath Delegat, die tableview sollte als zurück zu reagieren betrachtet werden. Dazu müssen Sie Tags hinzufügen, um die TableView, wie

#define MAIN_TABLE_VIEW 1001

#define DROP_DOWN_TABLE_VIEW 1002

Jetzt in Ihrem didSelectRowAtIndexPath, versuchen Sie Ihren Weg der Ausführung nach rechts Tableview erneut direkt basierend auf Variablenwerte.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 
    if(tablview.tag == MAIN_TABLE_VIEW){ 
    // follow your code for main table view here 
    } 

    if(tablview.tag == DROP_DOWN_TABLE_VIEW){ 
    // follow your code for dropdown table view here. 
    } 
} 

Der gleiche Ansatz kann man in allen delegates von UITableView folgen.

Hoffe das löst den Zweck.

+0

Das gleiche Tagging sollte auch für das 'UItextField' durchgeführt werden. –

+0

Nein. Die Dropdown-Tabelle Delegaten, ich handle mit einer anderen Klasse. –

+0

Verwenden Sie dann 'sender.bounds' anstelle von' 0', während Sie den Rahmen 'DropDown UITableView' setzen. Wie 'sender.bounds.origin.x, sender.bounds.origin, y, width, height' –

2

Ich denke, ich hatte das gleiche Problem, wo haben Sie die UITableViewDelegate und UITableViewDataSource, nur in ViewController nur erklärt?

Ich denke, Sie haben den Delegierten verloren, weil Sie brauchen und hat den Delegierten der TableView innerhalb der UIView zugewiesen? Recht?

Umhänge die Delegierten auf Anzeigen oder rufen/Laden Tableview aus einer anderen Ansicht ..

Hoffnung dies nützlich .. :)

2

ich in der Lage war etwas sehr ähnlich zu erreichen, was Sie wollen für ein vergangenes Projekt tun. Was wir am Ende war dabei die textfield.inputView anstelle der tableView wie diese enthalten:

enter image description here

1

Es ist unklar, welche in die Sie hinzufügen Ihre Drop-Down-subview ansehen Sind Sie es in der Tableview oder in der Ansicht hinzufügen. das enthält die TableView (übrigens, durch Ihre Beschreibung, Sie verwenden keinen UITableViewController). Meine Vermutung ist, dass Sie es in der Tabellenansicht hinzufügen, und das verursacht Probleme. Versuchen Sie, es zur ViewController.view hinzuzufügen (was bedeutet, dass Sie die richtigen Koordinaten des Frames relativ zum textField innerhalb der Zelle erhalten müssen).