2016-12-13 5 views
0

Ich verwende eine benutzerdefinierte Zellklasse, um eine Tabelle in Swift zu füllen.Ich versuche, eine benutzerdefinierte Zelle mit einer Aktionsschaltfläche zu füllen

Ich muss es für eine Reihe von Schaltflächen arbeiten, so dass jede Zelle eine Schaltfläche hat, die eine IBAction-Funktion für diese Zelle durchführt.

Hier ist meine Zelle Klasse auf die Schaltfläche Variable deklariert:

class taskCell: UITableViewCell { 
    @IBOutlet weak var performTask: UIButton! 
    //ignoring code irrelevant to question 
} 

All meine „Aufgaben“, die ich passieren soll, wenn die Taste ist eine Variation des folgenden Musters gedrückt wird:

@IBAction func task1(sender: AnyObject){ 
    if (prerequisite1 >= 1) { 
     prerequisite1 = prerequisite1 - 1; 
     points = points + 400; 
     prerequisite1Label.text = "\(prerequisite1)"; 
     pointsLabel.text = "\(points)"; 
    } 
} 

@IBAction func task2(sender: AnyObject){ 
     if (prerequisite2 >= 1) { 
      prerequisite2 = prerequisite2 - 1; 
      points = points + 600; 
      prerequisite1Label.text = "\(prerequisite2)"; 
      pointsLabel.text = "\(points)"; 
     } 
    } 

Hier ist mein Versuch, sie in einem Array in meinem Viewcontroller zu setzen, dass die Tabelle in ist:

let firstTasks:[()->()] = [tasksViewController().task1(), tasksViewController().task2()] 

Und schließlich hier ist mein Versuch, deren Umsetzung es in der Tableview Umsetzung:

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

    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! JobCell 
     cell.performTask.tag = indexPath.row 
     cell.performTask.addTarget(self, action: firstTasks[indexpath.row], forControlEvents: .TouchUpInside)  

     return cell 
    } 
+1

hierfür keine Notwendigkeit, um es komplex, jus zuweisen Tag in cellforrow Methode wie folgt: cell.performtask.tag = indexpath.row und dann, wenn Ihre Methode aufgerufen wird, können Sie ihren Argument (Absender) als Sender.Tech == Ihr Wert chek, um es zu arbeiten –

+0

Ich bin immer noch buggling, um dies zu implimentieren. Ich kann immer noch performTask nicht mit den Funktionsaufgaben verknüpfen –

+0

ping mich, jetzt wo du stecken geblieben bist, werde ich dir helfen –

Antwort

1

Statt halten die Funktionen Array. Warum Sie nicht so etwas tun:

class JobCell: UITableViewCell { 
    @IBOutlet weak var performTask: UIButton! 
    var actionBlock: (sender: AnyObject?) -> Void?   

    func someFunc() { 
     performTask. addTargetself, action: #selector(JobCell.didTapButton(_:)), forControlEvents: .TouchUpInside) 
    } 

    func didTapButton(sender: AnyObject) { 
     actionBlock?(sender) 
    } 
} 

In Viewcontroller:

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

    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! JobCell 
    cell.actionBlock = {(sender) in 
     // do ur thing 
    } 
    return cell 
} 
Verwandte Themen