uynva uynva - 2 months ago 20
Swift Question

Custom Cell error addTarget button

I created a layout as follows: in storyborad I have a view that contains a table view and I associate the Class TableViewController. Then I created a new View with a custom cell and assigned to it the class CustomCell.

I have problems when I try to assign an action to the button. For various reasons I need to assign the action in TableViewController.

This is my code:

This is CustomCell:

class CustomCategoryTableViewCell:UITableViewCell {

@IBOutlet weak var customButton: UIButton!
@IBOutlet weak var title: UILabel!

override func awakeFromNib() {
super.awakeFromNib()

}

override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
println("Cell is selected.")

}
}


And this is my TableViewController:

override func viewDidLoad() {
super.viewDidLoad()

// Register custom cell
var nib = UINib(nibName: "CategoryCell", bundle: nil)
tableView.registerNib(nib, forCellReuseIdentifier: "CustomCellCategory")

…more code
}


override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
println("numero rihe \(myArray.count)")
return myArray.count
}

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

let cellCustom:CustomCategoryTableViewCell = tableView.dequeueReusableCellWithIdentifier("CustomCellCategory") as CustomCategoryTableViewCell

// Button
cellCustom.customButton.tag = indexPath.row

println("current level: \(myArray[indexPath.row].level)")

if (myArray[indexPath.row].level > 0){
var puppy=""

for (var i = 0; i < myArray[indexPath.row].level; i++){
puppy += " "
}
cellCustom.title.text = "\(puppy)-\(myArray[indexPath.row].nameCategory)"
}else{
cellCustom.title.text = myArray[indexPath.row].nameCategory
}

// Setto button aperto/chiuso
if (myArray[indexPath.row].isOpen){

var image = UIImage(named: "item-icon-folder.png");
cellCustom.customButton.setBackgroundImage(image, forState: UIControlState.Normal)

}else{

var image = UIImage(named: "item-icon-folder-selected.png");
cellCustom.customButton.setBackgroundImage(image, forState: UIControlState.Normal)
}

//cellCustom.customButton(cellCustom, action:"searchChild", forControlEvents: UIControlEvents.TouchUpInside)


// Nascondo Button.
if (!myArray[cellCustom.customButton.tag].hasChild){
print("Non ha figli")
cellCustom.customButton.hidden = true

var image = UIImage(named: "item-counter.png");
cellCustom.customButton.setBackgroundImage(image, forState: UIControlState.Normal)
}
cellCustom.customButton.addTarget(cellCustom, action: "buttonAction", forControlEvents: UIControlEvents.TouchUpInside)

cellCustom.title.numberOfLines = 3
cellCustom.title.lineBreakMode = .ByWordWrapping

return cellCustom
}


func buttonAction(sender:UIButton!) {
println(“tapped”)
}


When i run this, get me a error:

*** First throw call stack:
(
0 CoreFoundation 0x000000010c574f35 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x000000010e0b8bb7 objc_exception_throw + 45
2 CoreFoundation 0x000000010c57c04d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
3 CoreFoundation 0x000000010c4d427c ___forwarding___ + 988
4 CoreFoundation 0x000000010c4d3e18 _CF_forwarding_prep_0 + 120
5 UIKit 0x000000010ce018be -[UIApplication sendAction:to:from:forEvent:] + 75
6 UIKit 0x000000010cf08410 -[UIControl _sendActionsForEvents:withEvent:] + 467
7 UIKit 0x000000010cf077df -[UIControl touchesEnded:withEvent:] + 522
8 UIKit 0x000000010d1ae540 _UIGestureRecognizerUpdate + 9487
9 UIKit 0x000000010ce46ff6 -[UIWindow _sendGesturesForEvent:] + 1041
10 UIKit 0x000000010ce47c23 -[UIWindow sendEvent:] + 667
11 UIKit 0x000000010ce149b1 -[UIApplication sendEvent:] + 246
12 UIKit 0x000000010ce21a7d _UIApplicationHandleEventFromQueueEvent + 17370
13 UIKit 0x000000010cdfd103 _UIApplicationHandleEventQueue + 1961
14 CoreFoundation 0x000000010c4aa551 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
15 CoreFoundation 0x000000010c4a041d __CFRunLoopDoSources0 + 269
16 CoreFoundation 0x000000010c49fa54 __CFRunLoopRun + 868
17 CoreFoundation 0x000000010c49f486 CFRunLoopRunSpecific + 470
18 GraphicsServices 0x000000011066b9f0 GSEventRunModal + 161
19 UIKit 0x000000010ce00420 UIApplicationMain + 1282
20 XMLParser-Tutorial 0x000000010c24056e top_level_code + 78
21 XMLParser-Tutorial 0x000000010c2405aa main + 42
22 libdyld.dylib 0x000000010e892145 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)

Answer

The reason this is not working is because you are setting the delegate as "cellCustom" and not as the view controller. Replace this line:

cellCustom.customButton.addTarget(cellCustom, action: "buttonAction", forControlEvents: UIControlEvents.TouchUpInside)

With this:

cellCustom.customButton.addTarget(self, action: "buttonAction:", forControlEvents: UIControlEvents.TouchUpInside)