2014-11-12 13 views
12

Ich möchte einen Übergang von einer Schaltfläche innerhalb einer benutzerdefinierten UITableViewCell ausführen, aber ich weiß nicht, wie auf den Inhalt der Zelle zuzugreifen, wenn ich diese Schaltfläche drücken. Ich weiß, dass dies durch didSelectRowAtIndexPath erreicht werden könnte, aber ich habe diese Methode, die eine andere Funktion ausführt, und ich möchte die Schaltfläche verwenden, die ich in der Tabellenzelle erstellt habe.Einen Übergang von einer Schaltfläche innerhalb einer benutzerdefinierten UITableViewCell ausführen

Hier ist meine ausführen segue Methode, die ich habe Probleme mit:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
{ 
    if segue.identifier == "showComments" 
    { 
     let vc:CommentOnPostViewController = segue.destinationViewController as CommentOnPostViewController 

     var buttonPosition:CGPoint = sender?.convertPoint(CGPointZero, toView: self.feed) as CGPoint! 
     var path:NSIndexPath = self.feed.indexPathForRowAtPoint(buttonPosition) as NSIndexPath! 

     var postToCommentOn:PFObject = feedList[path.row] as PFObject 
     vc.post = postToCommentOn as PFObject 
    } 
} 

ich den Knopf in der Zelle markieren, wenn es angezeigt wird, und ihm eine Zielaktion geben:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
{ 
    // There is code that goes here for creating and displaying the cell. 

    cell.commentButton.tag = indexPath.row 
    cell.commentButton.addTarget(self, action: "addComment", forControlEvents: UIControlEvents.TouchUpInside) 
} 

Hier ist die Aktion, die beim Drücken der Taste aufgerufen wird:

func addComment() 
{ 
    self.performSegueWithIdentifier("showComments", sender: self) 
} 

Jede Hilfe wird geschätzt. Vielen Dank!

+0

Kannst du nicht selbst übergeben, aber die Schaltfläche oder die Zelle als Absender? –

+0

Verwenden Sie einen Delegaten, um so etwas zu erreichen.Der Delegat wird in der CustomCell-Klasse definiert, und auf dem TableViewController wird der Delegat jeder Zelle festgelegt. Definieren Sie auf dem UITableViewController die Methode des Delegaten, der Sie self aufruft. performSegueWithIdentifier ... Nur aus Neugier was machst du mit "didSelectRowAtIndexPath"? –

Antwort

30

Erstellen eines Protokolls mit der Methode, die von den CustomCell die Delegierten aufgerufen wird, definiert auf dem Tableviewcontroller

//Pass any objects, params you need to use on the 
//segue call to send to the next controller. 

protocol MyCustomCellDelegator { 
    func callSegueFromCell(myData dataobject: AnyObject) 
} 

nun das Protokoll über Ihre UITableViewController verwenden

class MyTableViewController : UITableViewController, MyCustomCellDelegator { 


//The usual Defined methods by UIViewController and UITableViewController 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    //Set the CustomCell new Delegate 
    var cell = tableView.dequeueReusableCellWithIdentifier(customIdentifier) as MyCustomCell 


    cell.delagete = self 

    return cell 

} 


//MARK: - MyCustomCellDelegator Methods 

func callSegueFromCell(myData dataobject: AnyObject) { 
    //try not to send self, just to avoid retain cycles(depends on how you handle the code on the next controller) 
    self.performSegueWithIdentifier("showComments", sender:dataobject) 

} 

} 

den Delegierten definieren auf Benutzerdefinierte Zelle und der Anruf innerhalb Ihrer neuen Schaltfläche die Delegiertenfunktion.

class MyCustomCell : UITableViewCell { 

     var delegate:MyCustomCellDelegator! 
     @IBOutlet weak var myButton:UIButton 



    @IBAction func buttonPressed(sender:AnyObject){ 
      var mydata = "Anydata you want to send to the next controller" 
      if(self.delegate != nil){ //Just to be safe. 
      self.delegate.callSegueFromCell(mydata) 
      } 
    } 
} 

Hoffentlich kann dies sauber und klar für Sie zu verstehen und in Ihrem Code implementieren.

+0

Wie erstelle ich das Segment mit dem Storyboard? Wo ziehe ich STRG + von? –

+0

@ChristopherFrancisco STRG + Drag von der Steuerung, die Sie von der Ziel-Controller verschieben möchten, und es sollte Ihnen einige Optionen zeigen: Show, Push, Modal so etwas. Und das ist es. Oh und achte darauf, dass du dem neu erstellten Segment eine Kennung hinzufügst. –

+0

Wie erstellen Sie ein Protokoll? Offensichtlich imitieren Sie den angezeigten Code, aber in welchem ​​ViewController? Oder sind Protokolle eigenständig? Wenn ich eigenständig arbeite, erstelle ich eine ganz neue Swift-Datei? –

0

Ich fand eine schnellere Antwort für die Übergabe von Daten mit einer Schaltfläche in einer dynamischen Zelle an eine neue VC.

  1. eine Tableview einrichten, eine eigene Zelle (die Zelle mit dem erstellten Klasse verbinden und eine zell Kennung gesetzt) ​​und einen neuen VC erstellen und über eine segue verbinden (auch eine Kennung für den Übergang festgelegt) Ihren aktuellen Tableviewcontroller

  2. Einstellung Ihrer Zelle mit dem Ausgang (cellButton)

    class CustomCell: UITableViewCell { 
        @IBOutlet weak var cellButton: UIButton! 
    
    
        override func awakeFromNib() { 
         super.awakeFromNib() 
        } 
    
        override func setSelected(_ selected: Bool, animated: Bool) { 
         super.setSelected(selected, animated: animated) 
        } 
    } 
    
  3. CellForRowAt Funktion in der Tableviewcontroller-Klasse

    nach oben
  4. die Schaltfläche Methode einrichten, die durch das Ziel des Knopfs

    func buttonTapped(_ sender:UIButton!){ 
        self.performSegue(withIdentifier: "customSegueIdentifier", sender: sender) 
    } 
    
  5. Vorbereitung für segue Funktion

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
        if(segue.identifier == "customSegueIdentifier") { 
         if let destination = segue.destination as? YourNewViewController { 
    
          if let button:UIButton = sender as! UIButton? { 
           print(button.tag) //optional 
           destination.valueViaSegue = button.tag 
          } 
         } 
        } 
    } 
    

Hoffnung dieser Code wird Ihnen helfen, Jungs genannt wird. Keep Coding;)

+0

Vielen Dank! Ich schätze Ihren Input und Ihre Mühe, diese Lösung zu erstellen! Würde es Ihnen etwas ausmachen, ein bisschen darüber zu erzählen, wie es schneller geht? – user3353890

Verwandte Themen