2015-05-07 7 views
6

In meiner Hauptseite habe ich eine XIB-Datei für UITableViewCell erstellt. Ich lade die Zelle aus dieser XIB-Datei und es funktioniert gut.Wie fügt man eine Schaltfläche mit Klickereignis auf UITableViewCell in Swift hinzu?

Innerhalb der Zelle habe ich einige Etiketten und Knöpfe. Ich möchte die Beschriftung ändern, indem ich auf den Knopf in der Zelle klicke.

My-Code mag unter

import UIKit 


class SepetCell: UITableViewCell{ 

    @IBOutlet var barcode: UILabel! 
    @IBOutlet var name: UILabel! 
    @IBOutlet var fav: UIButton! 
    @IBOutlet var strep: UIStepper! 
    @IBOutlet var times: UILabel! 



    @IBAction func favoriteClicked(sender: UIButton) { 
     println(sender.tag) 
     println(times.text) 

     SepetViewController().favorite(sender.tag) 



    } 
    override func awakeFromNib() { 
     super.awakeFromNib() 
     // Initialization code 
    } 

    override func setSelected(selected: Bool, animated: Bool) { 
     super.setSelected(selected, animated: animated) 

     // Configure the view for the selected state 
    } 
} 

Dies ist meine xib Dateien hinter Codes als .swift.

Die Codes in der Haupt-Seite gerne unter:

import UIKit 
import CoreData 

class SepetViewController: UIViewController, UITextFieldDelegate, UITableViewDataSource, UITableViewDelegate { 

    @ 
    IBOutlet 
    var sepetTable: UITableView! 
    var barcodes: [CART] = [] 

    let managedObjectContext = (UIApplication.sharedApplication().delegate as!AppDelegate).managedObjectContext 

    override func viewWillAppear(animated: Bool) { 
    if let moc = self.managedObjectContext { 


     var nib = UINib(nibName: "SepetTableCell", bundle: nil) 
     self.sepetTable.registerNib(nib, forCellReuseIdentifier: "productCell") 
    } 
    fetchLog() 
    sepetTable.reloadData() 
    } 

    func fetchLog() { 

    if let moc = self.managedObjectContext { 
     barcodes = CART.getElements(moc); 
    } 
    } 



    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) - > Int { 
    return self.barcodes.count 
    } 

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


    let cell = tableView.dequeueReusableCellWithIdentifier("productCell") as ? SepetCell 


    if cell == nil { 
     println("cell nil") 

    } 



    let product: CART 
    product = barcodes[indexPath.row] 



    cell!.barcode ? .text = product.barcode 
    cell!.name ? .text = product.name 
    cell!.fav.tag = indexPath.row 

    return cell! 
    } 

    func favorite(tag: Int) { 



    } 
} 

Wenn i FAV-Taste innerhalb der Zelle angeklickt. Ich wollte mal Text zB auf irgendwas ändern.

Wenn ich auf die Schaltfläche "fav" geklickt habe, wird das Ereignis an die Funktion functionClicked (sender: UIButton) von SepetCell.swift übergeben.

Also, wenn ich versuche zu nennen:. SepetViewController() Favorit (sender.tag)

Es geht im Inneren des

func favorite(tag: Int) { 

     sepetTable.reloadData() 

    } 

aber sepetTable ist gleich Null, wenn es dort weg ist. Ich denke es liegt daran, wenn ich diese SepetViewController(). Favorite (sender.tag) Funktion aufruft. Es erstellt zuerst die SepetViewController-Klasse. Weil das Objekt nicht gesetzt ist, wird es null.

Wie erreiche ich diese SepetTable oder was ist der beste Weg, um dieses Problem zu lösen.

Danke.

Antwort

28

würde ich einen Verschluss in der Zellklasse definieren:

class SepetCell: UITableViewCell{ 
    var onButtonTapped : (() -> Void)? = nil 

dann

@IBAction func favoriteClicked(sender: UIButton) { 
     println(sender.tag) 
     println(times.text) 
     if let onButtonTapped = self.onButtonTapped { 
      onButtonTapped() 
     } 
    } 

dann in Ihrem Tableview Delegierten:

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

    let cell = tableView.dequeueReusableCellWithIdentifier("productCell") as ? SepetCell 
    cell.onButtonTapped = { 
     //Do whatever you want to do when the button is tapped here 
    } 

hoffe, das hilft!

+0

vielen Dank. es hat für mich funktioniert. Wenn ich etwas von SepetCell zu tableView schicken möchte, was soll ich tun? Zum Beispiel habe ich einen strepper und wenn ich darauf klicke, möchte ich den Wert des Labels ändern –

+2

ok Ich habe es durch einige Versuche gefunden :) Ich habe einige Änderungen am Code wie gemacht: var onFavButtonTapped: ((Int) - > Leere)? = Nil **** wenn lassen onButtonTapped = self.onButtonTapped { onButtonTapped (3) } **** Zelle .onButtonTapped = {(x: Int) in println (x) } –

+0

groß hören!. BTW, wenn Sie meine Antwort nützlich fanden, bitte erwägen Upvoting :) – raf

Verwandte Themen