I try to remove an item from a collection view based on a user's choice in an alert.
I have the following code:
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
let person = people[indexPath.item]
let questionController = UIAlertController(title: "What u wanna do?", message: nil, preferredStyle: .Alert)
questionController.addAction(UIAlertAction(title: "Rename person", style: .Default, handler: {
(action:UIAlertAction!) -> Void in
let ac = UIAlertController(title: "Rename person", message: nil, preferredStyle: .Alert)
ac.addTextFieldWithConfigurationHandler(nil)
ac.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: nil))
ac.addAction(UIAlertAction(title: "OK", style: .Default) { [unowned self, ac] _ in
let newName = ac.textFields![0] as! UITextField
person.name = newName.text
self.collectionView.reloadData() })
self.presentViewController(ac, animated: true, completion: nil)
}))
questionController.addAction(UIAlertAction(title: "Delete Person", style: .Default, handler: {
(action:UIAlertAction!) -> Void in
println("hello world")
self.collectionView.deleteItemsAtIndexPaths([indexPath.item])
self.collectionView.reloadData()
}))
presentViewController(questionController, animated: true, completion: nil)
}
"hello world" works okay but the app crashes when I press "Delete Person".
The console output is
hello world
2015-07-18 13:40:14.628 Project10[15888:1274436] -[__NSCFNumber section]: unrecognized selector sent to instance 0xb000000000000003
2015-07-18 13:40:14.636 Project10[15888:1274436] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber section]: unrecognized selector sent to instance 0xb000000000000003'
What am I doing wrong?
You should change
self.collectionView.deleteItemsAtIndexPaths([indexPath.item])
to
self.collectionView.deleteItemsAtIndexPaths([indexPath])
deleteItemsAtIndexPaths
expects an array of NSIndexPath
s, not an array of numbers.
Besides that, if you call deleteItemsAtIndexPaths
you don't need a call to reloadData
- this will even prevent any animation from happening.
Don't forget to update your data source - the person has to be removed from the people
array.
people.removeAtIndex(indexPath.item)
Do this before calling deleteItemsAtIndexPaths
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With