How do I get the current Item of a CollectionViewCell, Using a Button in the Cell?
I have a question about finding the selected Item of my CollectionViewCells. I want to bring the Data to another ViewController and then edit and save it to the selected Item of my Cells? The Problem is that there my current Item is alway 0 and so my first CollectionCell? I use for testing a ItemList.txt file.
One of the cells:
Here is my EditViewController:
class EditViewController: UIViewController
var itemList = ListItem.load()
didSet
ListItem.save(itemList)
@IBOutlet weak var editTextField: UITextField!
@IBOutlet weak var editView: UIView!
//var currentItem = 0
var currentText = ""
var currentItem = 0
override func viewDidLoad()
super.viewDidLoad()
editTextField.text = itemList[currentItem]
editView.clipsToBounds = true
editView.layer.borderColor = UIColor.black.cgColor
editView.layer.cornerRadius = 25
@IBAction func saveButton(_ sender: Any)
self.dismiss(animated: true, completion: nil)
editTextField.resignFirstResponder()
@IBAction func cancelButton(_ sender: Any)
self.dismiss(animated: true, completion: nil)
editTextField.resignFirstResponder()
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
self.editView.endEditing(true)
Here is my CollectionViewCell:
class CollectionViewCell: UICollectionViewCell
var btnTapAction : (()->())?
@IBOutlet weak var listLabel: UILabel!
@IBOutlet weak var editButton: UIButton!
required init?(coder aDecoder: NSCoder)
super.init(coder: aDecoder)
self.layer.cornerRadius = self.frame.size.width * 0.1
self.layer.borderWidth = 0
self.layer.borderColor = UIColor(red: 0.5, green: 0.47, blue: 0.25, alpha: 1.0).cgColor
@IBAction func editButtonTapped(_ sender: UIButton)
print("Tapped!")
btnTapAction?()
Here my cellForItemAt in the Main ViewController:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
let cell : CollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath) as! CollectionViewCell
cell.listLabel.text = itemList[indexPath.row]
cell.editButton.addTarget(self, action: #selector(editButtonTapped), for: UIControl.Event.touchUpInside)
cell.editButton.tag = indexPath.item
cell.editButton.isUserInteractionEnabled = true
cell.btnTapAction = () in
print("Edit tapped in cell", indexPath.item)
// start your edit process here...
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier: "edit") as! EditViewController
viewController.currentItem = indexPath.item
print("(viewController.currentItem)")
return cell
Here my ViewCollectionViewCell:
class CollectionViewCell: UICollectionViewCell
var btnTapAction : (()->())?
@IBOutlet weak var listLabel: UILabel!
@IBOutlet weak var editButton: UIButton!
required init?(coder aDecoder: NSCoder)
super.init(coder: aDecoder)
self.layer.cornerRadius = self.frame.size.width * 0.1
self.layer.borderWidth = 0
self.layer.borderColor = UIColor(red: 0.5, green: 0.47, blue: 0.25, alpha: 1.0).cgColor
@IBAction func editButtonTapped(_ sender: UIButton)
print("Tapped!")
btnTapAction?()
Maybe there is an answer for that, but I didn't find it.
ios swift database uicollectionview uicollectionviewcell
|
show 10 more comments
I have a question about finding the selected Item of my CollectionViewCells. I want to bring the Data to another ViewController and then edit and save it to the selected Item of my Cells? The Problem is that there my current Item is alway 0 and so my first CollectionCell? I use for testing a ItemList.txt file.
One of the cells:
Here is my EditViewController:
class EditViewController: UIViewController
var itemList = ListItem.load()
didSet
ListItem.save(itemList)
@IBOutlet weak var editTextField: UITextField!
@IBOutlet weak var editView: UIView!
//var currentItem = 0
var currentText = ""
var currentItem = 0
override func viewDidLoad()
super.viewDidLoad()
editTextField.text = itemList[currentItem]
editView.clipsToBounds = true
editView.layer.borderColor = UIColor.black.cgColor
editView.layer.cornerRadius = 25
@IBAction func saveButton(_ sender: Any)
self.dismiss(animated: true, completion: nil)
editTextField.resignFirstResponder()
@IBAction func cancelButton(_ sender: Any)
self.dismiss(animated: true, completion: nil)
editTextField.resignFirstResponder()
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
self.editView.endEditing(true)
Here is my CollectionViewCell:
class CollectionViewCell: UICollectionViewCell
var btnTapAction : (()->())?
@IBOutlet weak var listLabel: UILabel!
@IBOutlet weak var editButton: UIButton!
required init?(coder aDecoder: NSCoder)
super.init(coder: aDecoder)
self.layer.cornerRadius = self.frame.size.width * 0.1
self.layer.borderWidth = 0
self.layer.borderColor = UIColor(red: 0.5, green: 0.47, blue: 0.25, alpha: 1.0).cgColor
@IBAction func editButtonTapped(_ sender: UIButton)
print("Tapped!")
btnTapAction?()
Here my cellForItemAt in the Main ViewController:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
let cell : CollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath) as! CollectionViewCell
cell.listLabel.text = itemList[indexPath.row]
cell.editButton.addTarget(self, action: #selector(editButtonTapped), for: UIControl.Event.touchUpInside)
cell.editButton.tag = indexPath.item
cell.editButton.isUserInteractionEnabled = true
cell.btnTapAction = () in
print("Edit tapped in cell", indexPath.item)
// start your edit process here...
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier: "edit") as! EditViewController
viewController.currentItem = indexPath.item
print("(viewController.currentItem)")
return cell
Here my ViewCollectionViewCell:
class CollectionViewCell: UICollectionViewCell
var btnTapAction : (()->())?
@IBOutlet weak var listLabel: UILabel!
@IBOutlet weak var editButton: UIButton!
required init?(coder aDecoder: NSCoder)
super.init(coder: aDecoder)
self.layer.cornerRadius = self.frame.size.width * 0.1
self.layer.borderWidth = 0
self.layer.borderColor = UIColor(red: 0.5, green: 0.47, blue: 0.25, alpha: 1.0).cgColor
@IBAction func editButtonTapped(_ sender: UIButton)
print("Tapped!")
btnTapAction?()
Maybe there is an answer for that, but I didn't find it.
ios swift database uicollectionview uicollectionviewcell
Are you saying that this lineprint("Edit tapped in cell", indexPath.item)
always prints0
forindexPath.item
, regardless of which cell's button you tap?
– DonMag
Nov 15 '18 at 21:26
And... do you also have afunc editButtonTapped(...)
in your Main ViewController? Because it looks like you are adding a.touchUpInside
action to the button (in every cell) that callseditButtonTapped(...)
in your Main VC instead of calling (or in addition to calling)editButtonTapped(...)
in your cell class.
– DonMag
Nov 15 '18 at 21:29
My editButtonTapoed I have in the CollectionViewCell and when I print the indexPath.item it prints the selected item, so this is working! But when I want to edit the text it is always the first item, it is the zero item!?
– DKoenig82
Nov 15 '18 at 21:39
Your code showslet viewController = storyboard.instantiateViewController(withIdentifier: "edit") as! EditViewController
, and then you setviewController.currentItem = indexPath.item
... but where is the code that's actually showing that view controller?
– DonMag
Nov 16 '18 at 14:03
The code is the first code snippet!
– DKoenig82
Nov 16 '18 at 14:06
|
show 10 more comments
I have a question about finding the selected Item of my CollectionViewCells. I want to bring the Data to another ViewController and then edit and save it to the selected Item of my Cells? The Problem is that there my current Item is alway 0 and so my first CollectionCell? I use for testing a ItemList.txt file.
One of the cells:
Here is my EditViewController:
class EditViewController: UIViewController
var itemList = ListItem.load()
didSet
ListItem.save(itemList)
@IBOutlet weak var editTextField: UITextField!
@IBOutlet weak var editView: UIView!
//var currentItem = 0
var currentText = ""
var currentItem = 0
override func viewDidLoad()
super.viewDidLoad()
editTextField.text = itemList[currentItem]
editView.clipsToBounds = true
editView.layer.borderColor = UIColor.black.cgColor
editView.layer.cornerRadius = 25
@IBAction func saveButton(_ sender: Any)
self.dismiss(animated: true, completion: nil)
editTextField.resignFirstResponder()
@IBAction func cancelButton(_ sender: Any)
self.dismiss(animated: true, completion: nil)
editTextField.resignFirstResponder()
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
self.editView.endEditing(true)
Here is my CollectionViewCell:
class CollectionViewCell: UICollectionViewCell
var btnTapAction : (()->())?
@IBOutlet weak var listLabel: UILabel!
@IBOutlet weak var editButton: UIButton!
required init?(coder aDecoder: NSCoder)
super.init(coder: aDecoder)
self.layer.cornerRadius = self.frame.size.width * 0.1
self.layer.borderWidth = 0
self.layer.borderColor = UIColor(red: 0.5, green: 0.47, blue: 0.25, alpha: 1.0).cgColor
@IBAction func editButtonTapped(_ sender: UIButton)
print("Tapped!")
btnTapAction?()
Here my cellForItemAt in the Main ViewController:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
let cell : CollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath) as! CollectionViewCell
cell.listLabel.text = itemList[indexPath.row]
cell.editButton.addTarget(self, action: #selector(editButtonTapped), for: UIControl.Event.touchUpInside)
cell.editButton.tag = indexPath.item
cell.editButton.isUserInteractionEnabled = true
cell.btnTapAction = () in
print("Edit tapped in cell", indexPath.item)
// start your edit process here...
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier: "edit") as! EditViewController
viewController.currentItem = indexPath.item
print("(viewController.currentItem)")
return cell
Here my ViewCollectionViewCell:
class CollectionViewCell: UICollectionViewCell
var btnTapAction : (()->())?
@IBOutlet weak var listLabel: UILabel!
@IBOutlet weak var editButton: UIButton!
required init?(coder aDecoder: NSCoder)
super.init(coder: aDecoder)
self.layer.cornerRadius = self.frame.size.width * 0.1
self.layer.borderWidth = 0
self.layer.borderColor = UIColor(red: 0.5, green: 0.47, blue: 0.25, alpha: 1.0).cgColor
@IBAction func editButtonTapped(_ sender: UIButton)
print("Tapped!")
btnTapAction?()
Maybe there is an answer for that, but I didn't find it.
ios swift database uicollectionview uicollectionviewcell
I have a question about finding the selected Item of my CollectionViewCells. I want to bring the Data to another ViewController and then edit and save it to the selected Item of my Cells? The Problem is that there my current Item is alway 0 and so my first CollectionCell? I use for testing a ItemList.txt file.
One of the cells:
Here is my EditViewController:
class EditViewController: UIViewController
var itemList = ListItem.load()
didSet
ListItem.save(itemList)
@IBOutlet weak var editTextField: UITextField!
@IBOutlet weak var editView: UIView!
//var currentItem = 0
var currentText = ""
var currentItem = 0
override func viewDidLoad()
super.viewDidLoad()
editTextField.text = itemList[currentItem]
editView.clipsToBounds = true
editView.layer.borderColor = UIColor.black.cgColor
editView.layer.cornerRadius = 25
@IBAction func saveButton(_ sender: Any)
self.dismiss(animated: true, completion: nil)
editTextField.resignFirstResponder()
@IBAction func cancelButton(_ sender: Any)
self.dismiss(animated: true, completion: nil)
editTextField.resignFirstResponder()
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
self.editView.endEditing(true)
Here is my CollectionViewCell:
class CollectionViewCell: UICollectionViewCell
var btnTapAction : (()->())?
@IBOutlet weak var listLabel: UILabel!
@IBOutlet weak var editButton: UIButton!
required init?(coder aDecoder: NSCoder)
super.init(coder: aDecoder)
self.layer.cornerRadius = self.frame.size.width * 0.1
self.layer.borderWidth = 0
self.layer.borderColor = UIColor(red: 0.5, green: 0.47, blue: 0.25, alpha: 1.0).cgColor
@IBAction func editButtonTapped(_ sender: UIButton)
print("Tapped!")
btnTapAction?()
Here my cellForItemAt in the Main ViewController:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
let cell : CollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath) as! CollectionViewCell
cell.listLabel.text = itemList[indexPath.row]
cell.editButton.addTarget(self, action: #selector(editButtonTapped), for: UIControl.Event.touchUpInside)
cell.editButton.tag = indexPath.item
cell.editButton.isUserInteractionEnabled = true
cell.btnTapAction = () in
print("Edit tapped in cell", indexPath.item)
// start your edit process here...
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier: "edit") as! EditViewController
viewController.currentItem = indexPath.item
print("(viewController.currentItem)")
return cell
Here my ViewCollectionViewCell:
class CollectionViewCell: UICollectionViewCell
var btnTapAction : (()->())?
@IBOutlet weak var listLabel: UILabel!
@IBOutlet weak var editButton: UIButton!
required init?(coder aDecoder: NSCoder)
super.init(coder: aDecoder)
self.layer.cornerRadius = self.frame.size.width * 0.1
self.layer.borderWidth = 0
self.layer.borderColor = UIColor(red: 0.5, green: 0.47, blue: 0.25, alpha: 1.0).cgColor
@IBAction func editButtonTapped(_ sender: UIButton)
print("Tapped!")
btnTapAction?()
Maybe there is an answer for that, but I didn't find it.
class CollectionViewCell: UICollectionViewCell
var btnTapAction : (()->())?
@IBOutlet weak var listLabel: UILabel!
@IBOutlet weak var editButton: UIButton!
required init?(coder aDecoder: NSCoder)
super.init(coder: aDecoder)
self.layer.cornerRadius = self.frame.size.width * 0.1
self.layer.borderWidth = 0
self.layer.borderColor = UIColor(red: 0.5, green: 0.47, blue: 0.25, alpha: 1.0).cgColor
@IBAction func editButtonTapped(_ sender: UIButton)
print("Tapped!")
btnTapAction?()
class CollectionViewCell: UICollectionViewCell
var btnTapAction : (()->())?
@IBOutlet weak var listLabel: UILabel!
@IBOutlet weak var editButton: UIButton!
required init?(coder aDecoder: NSCoder)
super.init(coder: aDecoder)
self.layer.cornerRadius = self.frame.size.width * 0.1
self.layer.borderWidth = 0
self.layer.borderColor = UIColor(red: 0.5, green: 0.47, blue: 0.25, alpha: 1.0).cgColor
@IBAction func editButtonTapped(_ sender: UIButton)
print("Tapped!")
btnTapAction?()
ios swift database uicollectionview uicollectionviewcell
ios swift database uicollectionview uicollectionviewcell
edited Nov 16 '18 at 15:14
DKoenig82
asked Nov 15 '18 at 21:21
DKoenig82DKoenig82
73
73
Are you saying that this lineprint("Edit tapped in cell", indexPath.item)
always prints0
forindexPath.item
, regardless of which cell's button you tap?
– DonMag
Nov 15 '18 at 21:26
And... do you also have afunc editButtonTapped(...)
in your Main ViewController? Because it looks like you are adding a.touchUpInside
action to the button (in every cell) that callseditButtonTapped(...)
in your Main VC instead of calling (or in addition to calling)editButtonTapped(...)
in your cell class.
– DonMag
Nov 15 '18 at 21:29
My editButtonTapoed I have in the CollectionViewCell and when I print the indexPath.item it prints the selected item, so this is working! But when I want to edit the text it is always the first item, it is the zero item!?
– DKoenig82
Nov 15 '18 at 21:39
Your code showslet viewController = storyboard.instantiateViewController(withIdentifier: "edit") as! EditViewController
, and then you setviewController.currentItem = indexPath.item
... but where is the code that's actually showing that view controller?
– DonMag
Nov 16 '18 at 14:03
The code is the first code snippet!
– DKoenig82
Nov 16 '18 at 14:06
|
show 10 more comments
Are you saying that this lineprint("Edit tapped in cell", indexPath.item)
always prints0
forindexPath.item
, regardless of which cell's button you tap?
– DonMag
Nov 15 '18 at 21:26
And... do you also have afunc editButtonTapped(...)
in your Main ViewController? Because it looks like you are adding a.touchUpInside
action to the button (in every cell) that callseditButtonTapped(...)
in your Main VC instead of calling (or in addition to calling)editButtonTapped(...)
in your cell class.
– DonMag
Nov 15 '18 at 21:29
My editButtonTapoed I have in the CollectionViewCell and when I print the indexPath.item it prints the selected item, so this is working! But when I want to edit the text it is always the first item, it is the zero item!?
– DKoenig82
Nov 15 '18 at 21:39
Your code showslet viewController = storyboard.instantiateViewController(withIdentifier: "edit") as! EditViewController
, and then you setviewController.currentItem = indexPath.item
... but where is the code that's actually showing that view controller?
– DonMag
Nov 16 '18 at 14:03
The code is the first code snippet!
– DKoenig82
Nov 16 '18 at 14:06
Are you saying that this line
print("Edit tapped in cell", indexPath.item)
always prints 0
for indexPath.item
, regardless of which cell's button you tap?– DonMag
Nov 15 '18 at 21:26
Are you saying that this line
print("Edit tapped in cell", indexPath.item)
always prints 0
for indexPath.item
, regardless of which cell's button you tap?– DonMag
Nov 15 '18 at 21:26
And... do you also have a
func editButtonTapped(...)
in your Main ViewController? Because it looks like you are adding a .touchUpInside
action to the button (in every cell) that calls editButtonTapped(...)
in your Main VC instead of calling (or in addition to calling) editButtonTapped(...)
in your cell class.– DonMag
Nov 15 '18 at 21:29
And... do you also have a
func editButtonTapped(...)
in your Main ViewController? Because it looks like you are adding a .touchUpInside
action to the button (in every cell) that calls editButtonTapped(...)
in your Main VC instead of calling (or in addition to calling) editButtonTapped(...)
in your cell class.– DonMag
Nov 15 '18 at 21:29
My editButtonTapoed I have in the CollectionViewCell and when I print the indexPath.item it prints the selected item, so this is working! But when I want to edit the text it is always the first item, it is the zero item!?
– DKoenig82
Nov 15 '18 at 21:39
My editButtonTapoed I have in the CollectionViewCell and when I print the indexPath.item it prints the selected item, so this is working! But when I want to edit the text it is always the first item, it is the zero item!?
– DKoenig82
Nov 15 '18 at 21:39
Your code shows
let viewController = storyboard.instantiateViewController(withIdentifier: "edit") as! EditViewController
, and then you set viewController.currentItem = indexPath.item
... but where is the code that's actually showing that view controller?– DonMag
Nov 16 '18 at 14:03
Your code shows
let viewController = storyboard.instantiateViewController(withIdentifier: "edit") as! EditViewController
, and then you set viewController.currentItem = indexPath.item
... but where is the code that's actually showing that view controller?– DonMag
Nov 16 '18 at 14:03
The code is the first code snippet!
– DKoenig82
Nov 16 '18 at 14:06
The code is the first code snippet!
– DKoenig82
Nov 16 '18 at 14:06
|
show 10 more comments
1 Answer
1
active
oldest
votes
Your approach is not-quite-right.
In your .btnTapAction
closure, you create a new instance of EditViewController. However, as soon as that closure exits, that instance no longer exists.
cell.btnTapAction = () in
// you tapped the button
// this line prints the indexPath.item to the console
print("Edit tapped in cell", indexPath.item)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
// here, you create an instance of EditViewController
let viewController = storyboard.instantiateViewController(withIdentifier: "edit") as! EditViewController
// here, you set .currentItem in the instance of EditViewController
viewController.currentItem = indexPath.item
// you print that value to the console
print("(viewController.currentItem)")
// here, the closure exits, and
// viewController no longer exists!
At the same time you are running that code, your Segue is creating its own instance of EditViewController.
That's why .currentItem
is always Zero.
Instead, you need to save the indexPath.item
in a class-level variable, and then set .currentItem
inside prepare(for segue: ...)
:
class YourCollectionViewController: UICollectionViewController
var selectedItem = 0
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
if let newEditVC = segue.destination as? EditViewController
newEditVC.currentItem = self.selectedItem
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
let cell : CollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath) as! CollectionViewCell
cell.listLabel.text = itemList[indexPath.row]
cell.editButton.addTarget(self, action: #selector(editButtonTapped), for: UIControl.Event.touchUpInside)
cell.editButton.tag = indexPath.item
cell.editButton.isUserInteractionEnabled = true
cell.btnTapAction = () in
// you tapped the button
// this line prints the indexPath.item to the console
print("Edit tapped in cell", indexPath.item)
// set your class-level variable
// which will be used in prepare(for segue: ...)
self.selectedItem = indexPath.item
return cell
Or, another approach... Delete the Segue from Storyboard, and change your .btnTapAction
to this:
cell.btnTapAction = () in
// you tapped the button
// this line prints the indexPath.item to the console
print("Edit tapped in cell", indexPath.item)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
// here, you create an instance of EditViewController
let viewController = storyboard.instantiateViewController(withIdentifier: "edit") as! EditViewController
// here, you set .currentItem in the instance of EditViewController
viewController.currentItem = indexPath.item
// you print that value to the console
print("(viewController.currentItem)")
// present that instance of EditViewController
self.present(viewController, animated: true, completion: nil)
Thank you very very very much! It is now working!
– DKoenig82
Nov 16 '18 at 16:33
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53328062%2fhow-do-i-get-the-current-item-of-a-collectionviewcell-using-a-button-in-the-cel%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Your approach is not-quite-right.
In your .btnTapAction
closure, you create a new instance of EditViewController. However, as soon as that closure exits, that instance no longer exists.
cell.btnTapAction = () in
// you tapped the button
// this line prints the indexPath.item to the console
print("Edit tapped in cell", indexPath.item)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
// here, you create an instance of EditViewController
let viewController = storyboard.instantiateViewController(withIdentifier: "edit") as! EditViewController
// here, you set .currentItem in the instance of EditViewController
viewController.currentItem = indexPath.item
// you print that value to the console
print("(viewController.currentItem)")
// here, the closure exits, and
// viewController no longer exists!
At the same time you are running that code, your Segue is creating its own instance of EditViewController.
That's why .currentItem
is always Zero.
Instead, you need to save the indexPath.item
in a class-level variable, and then set .currentItem
inside prepare(for segue: ...)
:
class YourCollectionViewController: UICollectionViewController
var selectedItem = 0
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
if let newEditVC = segue.destination as? EditViewController
newEditVC.currentItem = self.selectedItem
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
let cell : CollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath) as! CollectionViewCell
cell.listLabel.text = itemList[indexPath.row]
cell.editButton.addTarget(self, action: #selector(editButtonTapped), for: UIControl.Event.touchUpInside)
cell.editButton.tag = indexPath.item
cell.editButton.isUserInteractionEnabled = true
cell.btnTapAction = () in
// you tapped the button
// this line prints the indexPath.item to the console
print("Edit tapped in cell", indexPath.item)
// set your class-level variable
// which will be used in prepare(for segue: ...)
self.selectedItem = indexPath.item
return cell
Or, another approach... Delete the Segue from Storyboard, and change your .btnTapAction
to this:
cell.btnTapAction = () in
// you tapped the button
// this line prints the indexPath.item to the console
print("Edit tapped in cell", indexPath.item)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
// here, you create an instance of EditViewController
let viewController = storyboard.instantiateViewController(withIdentifier: "edit") as! EditViewController
// here, you set .currentItem in the instance of EditViewController
viewController.currentItem = indexPath.item
// you print that value to the console
print("(viewController.currentItem)")
// present that instance of EditViewController
self.present(viewController, animated: true, completion: nil)
Thank you very very very much! It is now working!
– DKoenig82
Nov 16 '18 at 16:33
add a comment |
Your approach is not-quite-right.
In your .btnTapAction
closure, you create a new instance of EditViewController. However, as soon as that closure exits, that instance no longer exists.
cell.btnTapAction = () in
// you tapped the button
// this line prints the indexPath.item to the console
print("Edit tapped in cell", indexPath.item)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
// here, you create an instance of EditViewController
let viewController = storyboard.instantiateViewController(withIdentifier: "edit") as! EditViewController
// here, you set .currentItem in the instance of EditViewController
viewController.currentItem = indexPath.item
// you print that value to the console
print("(viewController.currentItem)")
// here, the closure exits, and
// viewController no longer exists!
At the same time you are running that code, your Segue is creating its own instance of EditViewController.
That's why .currentItem
is always Zero.
Instead, you need to save the indexPath.item
in a class-level variable, and then set .currentItem
inside prepare(for segue: ...)
:
class YourCollectionViewController: UICollectionViewController
var selectedItem = 0
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
if let newEditVC = segue.destination as? EditViewController
newEditVC.currentItem = self.selectedItem
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
let cell : CollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath) as! CollectionViewCell
cell.listLabel.text = itemList[indexPath.row]
cell.editButton.addTarget(self, action: #selector(editButtonTapped), for: UIControl.Event.touchUpInside)
cell.editButton.tag = indexPath.item
cell.editButton.isUserInteractionEnabled = true
cell.btnTapAction = () in
// you tapped the button
// this line prints the indexPath.item to the console
print("Edit tapped in cell", indexPath.item)
// set your class-level variable
// which will be used in prepare(for segue: ...)
self.selectedItem = indexPath.item
return cell
Or, another approach... Delete the Segue from Storyboard, and change your .btnTapAction
to this:
cell.btnTapAction = () in
// you tapped the button
// this line prints the indexPath.item to the console
print("Edit tapped in cell", indexPath.item)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
// here, you create an instance of EditViewController
let viewController = storyboard.instantiateViewController(withIdentifier: "edit") as! EditViewController
// here, you set .currentItem in the instance of EditViewController
viewController.currentItem = indexPath.item
// you print that value to the console
print("(viewController.currentItem)")
// present that instance of EditViewController
self.present(viewController, animated: true, completion: nil)
Thank you very very very much! It is now working!
– DKoenig82
Nov 16 '18 at 16:33
add a comment |
Your approach is not-quite-right.
In your .btnTapAction
closure, you create a new instance of EditViewController. However, as soon as that closure exits, that instance no longer exists.
cell.btnTapAction = () in
// you tapped the button
// this line prints the indexPath.item to the console
print("Edit tapped in cell", indexPath.item)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
// here, you create an instance of EditViewController
let viewController = storyboard.instantiateViewController(withIdentifier: "edit") as! EditViewController
// here, you set .currentItem in the instance of EditViewController
viewController.currentItem = indexPath.item
// you print that value to the console
print("(viewController.currentItem)")
// here, the closure exits, and
// viewController no longer exists!
At the same time you are running that code, your Segue is creating its own instance of EditViewController.
That's why .currentItem
is always Zero.
Instead, you need to save the indexPath.item
in a class-level variable, and then set .currentItem
inside prepare(for segue: ...)
:
class YourCollectionViewController: UICollectionViewController
var selectedItem = 0
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
if let newEditVC = segue.destination as? EditViewController
newEditVC.currentItem = self.selectedItem
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
let cell : CollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath) as! CollectionViewCell
cell.listLabel.text = itemList[indexPath.row]
cell.editButton.addTarget(self, action: #selector(editButtonTapped), for: UIControl.Event.touchUpInside)
cell.editButton.tag = indexPath.item
cell.editButton.isUserInteractionEnabled = true
cell.btnTapAction = () in
// you tapped the button
// this line prints the indexPath.item to the console
print("Edit tapped in cell", indexPath.item)
// set your class-level variable
// which will be used in prepare(for segue: ...)
self.selectedItem = indexPath.item
return cell
Or, another approach... Delete the Segue from Storyboard, and change your .btnTapAction
to this:
cell.btnTapAction = () in
// you tapped the button
// this line prints the indexPath.item to the console
print("Edit tapped in cell", indexPath.item)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
// here, you create an instance of EditViewController
let viewController = storyboard.instantiateViewController(withIdentifier: "edit") as! EditViewController
// here, you set .currentItem in the instance of EditViewController
viewController.currentItem = indexPath.item
// you print that value to the console
print("(viewController.currentItem)")
// present that instance of EditViewController
self.present(viewController, animated: true, completion: nil)
Your approach is not-quite-right.
In your .btnTapAction
closure, you create a new instance of EditViewController. However, as soon as that closure exits, that instance no longer exists.
cell.btnTapAction = () in
// you tapped the button
// this line prints the indexPath.item to the console
print("Edit tapped in cell", indexPath.item)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
// here, you create an instance of EditViewController
let viewController = storyboard.instantiateViewController(withIdentifier: "edit") as! EditViewController
// here, you set .currentItem in the instance of EditViewController
viewController.currentItem = indexPath.item
// you print that value to the console
print("(viewController.currentItem)")
// here, the closure exits, and
// viewController no longer exists!
At the same time you are running that code, your Segue is creating its own instance of EditViewController.
That's why .currentItem
is always Zero.
Instead, you need to save the indexPath.item
in a class-level variable, and then set .currentItem
inside prepare(for segue: ...)
:
class YourCollectionViewController: UICollectionViewController
var selectedItem = 0
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
if let newEditVC = segue.destination as? EditViewController
newEditVC.currentItem = self.selectedItem
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
let cell : CollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath) as! CollectionViewCell
cell.listLabel.text = itemList[indexPath.row]
cell.editButton.addTarget(self, action: #selector(editButtonTapped), for: UIControl.Event.touchUpInside)
cell.editButton.tag = indexPath.item
cell.editButton.isUserInteractionEnabled = true
cell.btnTapAction = () in
// you tapped the button
// this line prints the indexPath.item to the console
print("Edit tapped in cell", indexPath.item)
// set your class-level variable
// which will be used in prepare(for segue: ...)
self.selectedItem = indexPath.item
return cell
Or, another approach... Delete the Segue from Storyboard, and change your .btnTapAction
to this:
cell.btnTapAction = () in
// you tapped the button
// this line prints the indexPath.item to the console
print("Edit tapped in cell", indexPath.item)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
// here, you create an instance of EditViewController
let viewController = storyboard.instantiateViewController(withIdentifier: "edit") as! EditViewController
// here, you set .currentItem in the instance of EditViewController
viewController.currentItem = indexPath.item
// you print that value to the console
print("(viewController.currentItem)")
// present that instance of EditViewController
self.present(viewController, animated: true, completion: nil)
answered Nov 16 '18 at 15:14
DonMagDonMag
17.2k21030
17.2k21030
Thank you very very very much! It is now working!
– DKoenig82
Nov 16 '18 at 16:33
add a comment |
Thank you very very very much! It is now working!
– DKoenig82
Nov 16 '18 at 16:33
Thank you very very very much! It is now working!
– DKoenig82
Nov 16 '18 at 16:33
Thank you very very very much! It is now working!
– DKoenig82
Nov 16 '18 at 16:33
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53328062%2fhow-do-i-get-the-current-item-of-a-collectionviewcell-using-a-button-in-the-cel%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Are you saying that this line
print("Edit tapped in cell", indexPath.item)
always prints0
forindexPath.item
, regardless of which cell's button you tap?– DonMag
Nov 15 '18 at 21:26
And... do you also have a
func editButtonTapped(...)
in your Main ViewController? Because it looks like you are adding a.touchUpInside
action to the button (in every cell) that callseditButtonTapped(...)
in your Main VC instead of calling (or in addition to calling)editButtonTapped(...)
in your cell class.– DonMag
Nov 15 '18 at 21:29
My editButtonTapoed I have in the CollectionViewCell and when I print the indexPath.item it prints the selected item, so this is working! But when I want to edit the text it is always the first item, it is the zero item!?
– DKoenig82
Nov 15 '18 at 21:39
Your code shows
let viewController = storyboard.instantiateViewController(withIdentifier: "edit") as! EditViewController
, and then you setviewController.currentItem = indexPath.item
... but where is the code that's actually showing that view controller?– DonMag
Nov 16 '18 at 14:03
The code is the first code snippet!
– DKoenig82
Nov 16 '18 at 14:06