2017-12-17 6 views
0

Mit Swift4, iOS11.1, Xcode9.1,Welches TextField wurde in custom-Cell TableView ausgewählt?

Ich mache einen Übergang von einem TableView, versuche herauszufinden, welche der beiden TextFields (in meiner benutzerdefinierten Zelle) vom Benutzer berührt wurde. Mein benutzerdefinierter-Cell Tableview hat zwei Textfelder, wie im Bild unten zu sehen ist:

enter image description here

Hier ist mein Code so weit:

// tableView delegation-method: 
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    let cell = tableView.cellForRow(at: indexPath) 
    self.performSegue(withIdentifier: "goToMyNextVC", sender: cell) 
} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

    if segue.identifier == "goToMyNextVC" { 

     let newVC = segue.destination as! MyNextViewController 

     let indexPath = self.tableView.indexPathForSelectedRow 
     print(indexPath?.row) // !!!!!! The cell-row is correct 

     let cell = sender as! MyCustomTableViewCell 
     newVC.someTextProperty1 = cell.firstTextFiled.text! // works well 
     newVC.someTextProperty2 = cell.secondTextFiled.text! // works well 

     // !!!! BUT HOW DO I GET WHICH OF THE TWO TEXTFIELDS WAS TOUCHED ????????? 

     // newVC.someTextProperty3 = ??????? text of touched TextField ??????? 

    } 
} 

Jede Hilfe dankbar!

Antwort

1

Sie sollten ein Antippen-Ereignis für ein textField in Ihrer MyCustomTableViewCell-Klasse registrieren und dann delegieren, welches textField an Ihren viewController zurückgegeben wurde.

Aber eine einfachere Lösung ist nur zwei verschiedene Zellen für zwei verschiedene Textfelder zu verwenden.

+0

Dank für die beiden Ideen - ich werde es versuchen! – iKK

0

ich eine Lösung (irgendwie ausgelöst durch Demosthese hint) gefunden:

1.) Innerhalb der benutzerdefinierten Zelle: eine zell configure-Methode aufrufen (das Tag eines jeden Textfield (oder Etiketten acuatally in meinem Fall die Zuordnung jetzt ...)

func configureCell(tag: Int) { 

    // assign tag (later used to expand/collapse the right cell) 
    self.fristTextField.tag = 1 
    self.secondTextField.tag = 2 

    self.firstTextField.isUserInteractionEnabled = true 
    self.secondTextField.isUserInteractionEnabled = true 
} 
  1. innerhalb der benutzerdefinierten Zelle: a touchesBegan Methode mit dem Tag taht definieren Umsetzen berührt wird und ein "tagNrTouched" -Property

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    
        super.touchesBegan(touches, with: event) 
        let touch: UITouch = touches.first! 
    
        if (touch.view?.tag == self.firstTextField.tag) { 
         self.tagNrTouched = 1 
        } else if (touch.view?.tag == self.secondTextField.tag) { 
         self.tagNrTouched = 2 
        } 
    } 
    
    Zuweisen
  2. Im Inneren des Tableview, reagieren nur auf diese Eigenschaft vor segue'ing:

    // tableView delegation-method: 
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    { 
        let cell = tableView.cellForRow(at: indexPath) 
        self.performSegue(withIdentifier: "goToMyNextVC", sender: cell) 
    } 
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    
        if segue.identifier == "goToMyNextVC" { 
    
         let newVC = segue.destination as! MyNextViewController 
    
         let indexPath = self.tableView.indexPathForSelectedRow 
         print(indexPath?.row) // !!!!!! The cell-row is correct 
    
         let cell = sender as! MyCustomTableViewCell 
         newVC.someTextProperty1 = cell.firstTextFiled.text! // works well 
         newVC.someTextProperty2 = cell.secondTextFiled.text! // works well 
    
         // HERE IS THE FINAL SOLUTION: REACTING ACCORDING TO THE TAG-NR 
         if (cell.tagNrTouched == 1) { 
          textSearchVC.searchText = cell.firstTextField.text! 
         } else if (cell.tagNrTouched == 2) { 
          textSearchVC.searchText = cell.secondTextField.text! 
         } 
        } 
    } 
    
+0

Sie können Tag der gesamten Zelle nicht zu einem einzelnen Element in der Methode func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) beim Auspacken zuweisen und dann mit der Delegate-Methode senden. – mihatel

+0

Ich möchte unterscheiden, welches Element in einer benutzerdefinierten Zelle berührt wurde - daher Zuordnung zu einem einzelnen Element (und nicht ganze Zelle). Oder haben Sie ein Code-Beispiel dafür, was Sie genau meinen? – iKK

+0

Sorry hat das Problem nicht bekommen ... Ich bin verwirrt, warum nicht mit Schaltflächen und delegieren Controller anzeigen, wenn Sie stattdessen Textfeld geklickt haben? – mihatel

Verwandte Themen