Swift if statement being re-executed when button title updated - ios

So I have this very simple code, the button is set to the title "Title1" in IB
#IBAction func changeTitle(sender: AnyObject) {
let button = sender as UIButton
if (button.titleLabel == "Title1") {
button.setTitle("Title2", forState: .Normal)
} else {
button.setTitle("Title1", forState: .Normal)
}
}
So what's happening is that the first condition in the if statement gets executed, then the line of code updating the title of the button is hit, where then it goes back to the if statement, then finding it false, and skipping to the else {} now... I cannot figure out why this is happening.
Thanks in advance

This should work:
#IBAction func changeTitle(sender: AnyObject) {
let button = sender as UIButton
if (button.titleLabel?.text == "Title1") {
button.setTitle("Title2", forState: .Normal)
} else {
button.setTitle("Title1", forState: .Normal)
}
}

Related

Toggle between select/deselect UIButton

I have a button which I want to change background color and text when tapped(select) and bring it back to its original state when tapped again (deselect). I am able to select it but I am not being able to deselect it. I have researched on SO and I am getting errors in this code in the if-else part
#IBAction func btn1Pressed(_ sender: AnyObject) {
sender.setTitleColor(UIColor.blue, for: UIControlState.normal)
(sender as! UIButton).backgroundColor = UIColor.green
if sender.isSelected {
sender.selected = false
}
else {
sender.selected = true
}
}
Try this:
#IBAction func btnPressed(_ sender: AnyObject) {
guard let button = sender as? UIButton else { return }
if !button.isSelected {
button.isSelected = true
button.setTitleColor(UIColor.blue, for: UIControl.State.normal)
button.backgroundColor = UIColor.green
}
else {
button.isSelected = false
button.setTitleColor(UIColor.green, for: UIControl.State.normal)
button.backgroundColor = UIColor.blue
}
}
It sounds to me like UISwitch is what you're looking for. Give it a try instead of wasting time implementing something that's already there for you.
try this
#IBAction func btn1Pressed(sender: UIButton) {
if sender.selected {
sender.selected = false
sender.setTitleColor(UIColor.redColor(), forState: .Normal)
sender.backgroundColor = UIColor.blackColor()
}
else {
sender.selected = true
sender.setTitleColor(UIColor.redColor(), forState: .Selected)
sender.backgroundColor = UIColor.blackColor()
}
}
Change background color of selected button from storyboard like below in state config choose selected and then change background color and also coustomize default for normal button.
and use below in action
(sender as! UIButton).selected = !(sender as! UIButton).selected
Please try this code first you need to crate action and propert of the button like
#IBOutlet var btn_ButtonPressed: UIButton!
then Action.
#IBAction func click_ButtonPressed(_ sender: Any) {
if !sender.isSelected() {
sender.selected = true
btn_ButtonPressed.setTitleColor(UIColor.red, forState: .normal)
btn_ButtonPressed.backgroundColor = UIColor.yellow
}
else {
sender.selected = false
btn_ButtonPressed.setTitleColor(UIColor.yellow, forState: .normal)
btn_ButtonPressed.backgroundColor = UIColor.red
}
}
this one worked fine for me!
//
#IBAction func buttonColorChanger(sender : UIButton ) {
if button.isSelected == false
{
button.backgroundColor = UIColor.purple
print("selected")
button.setTitle("selected", for: .normal)
button.setTitleColor(UIColor.white, for: .normal)
button.isSelected = true
}else{
button.backgroundColor = UIColor.white
print("unselected")
button.isSelected = false
}
}
A cleaner approach would be:
#objc private func buttonTapped(_ sender: UIButton) {
sender.isSelected.toggle()
if selected {
// Setup appearance for selected state.
} else {
// Setup appearance for deselected state.
}
}

UIButton text returns to original value after setting a new value to it

My UIButton is in a UICollectionviewcell, which is in a UICollectionview, which is in a UITableViewCell, which is in a UITableView.
The button is a like button, I want it to change its text when clicked. But after changing the text, it returns the original value. What might be the reason here?
Here is what it looks like:
https://gfycat.com/UnlawfulGroundedErin
This is the onClickEvent of button:
#IBAction func actionClick(sender: MyActionButton) {
if (sender.toggle){
print("Do dislike call here.")
sender.toggle = false
sender.titleLabel?.text = "Like"
}else{
print("Do like call here.")
sender.toggle = true
sender.titleLabel?.text = "Unlike"
}
}
Try This. It will work properly
#IBAction func actionClick(sender: MyActionButton) {
if (sender.toggle){
print("Do dislike call here.")
sender.toggle = false
sender.titleLabel?.text = "Like"
sender.setTitle("Like", forState: UIControlState.Normal)
}else{
print("Do like call here.")
sender.toggle = true
sender.setTitle("Unlike", forState: UIControlState.Normal)
}
}
UIButton have different texts for its title in different states.
Just for your knowledge
In viewDidLoad:
btnObject.setTitle("Like", forState: UIControlState.Normal)
btnObject.setTitle("Unlike", forState: UIControlState.Selected)
then in method actionClick: if you write only one statement,
sender.selected = !sender.selected;
it will work.
try this
#IBAction func actionClick(sender: UIButton) {
if sender.isSelected() {
sender.selected = false
sender.setTitle("Like", forState: UIControlState.Normal)
}
else {
sender.selected = true
sender.setTitle("Unlike", forState: UIControlState.Normal)
}
}
Choice-2
var isSelectFirst:Bool = false
#IBAction func actionClick(sender: UIButton) {
if isHighLighted == false{
sender.setTitle("Unlike", forState: UIControlState.Normal)
isHighLighted = true
}else{
sender.setTitle("Like", forState: UIControlState.Normal)
isHighLighted = false
}
}

UIButton not changing image

I'm trying to create a "like" button for my app. When I press the button, I want it to change to a second image, and when I press it again I went it to change back to the first image.
Here is my code:
#IBAction func sendLike(sender: UIButton) {
if let _ = UIImage(named:"pinkLike.png") {
sender.setImage(UIImage(named:"like.png"), forState: .Normal)
}
if let _ = UIImage(named:"like.png") {
sender.setImage(UIImage(named:"pinkLike.png"), forState: .Normal)
}
}
For some reason this line of code works how I want it to:
if let _ = UIImage(named:"like.png") {
sender.setImage(UIImage(named:"pinkLike.png"), forState: .Normal)
}
But when I press the button again, this line doesn't change it back:
if let _ = UIImage(named:"pinkLike.png") {
sender.setImage(UIImage(named:"like.png"), forState: .Normal)
}
You set both of those image in Normal state, so your "like.png" will always override "pinkLike.png" image.
You need to put "pinkLike.png" in different state.
if let _ = UIImage(named:"pinkLike.png") {
sender.setImage(UIImage(named:"like.png"), forState: .Selected)
}
and change your selected state before setting the image. So your code will be like this.
#IBAction func sendLike(sender: UIButton) {
sender.selected = !sender.selected
if let _ = UIImage(named:"pinkLike.png") {
sender.setImage(UIImage(named:"like.png"), forState: .Normal)
}
if let _ = UIImage(named:"like.png") {
sender.setImage(UIImage(named:"pinkLike.png"), forState: .Selected)
}
}

Select/deselect buttons swift xcode 7

Part way done with learning swift but I hit a small wall and yet again, I'm sure I'm just a bit new at this and an easy solution is there but I'm having trouble figuring out how to select/deselect buttons below is what I have so far and it is a button turns into a checkmark when clicked on... I've gotten that far but I need that button to deselect when clicked on again and then obviously be able to be clicked again if need be.
#IBAction func buttonPressed(sender: AnyObject) {
sender.setImage(UIImage(named: "Checkmark.png"), forState: .Normal)
}
Swift 3 note: .selected and .checked are now lower case UIControlState values in the SDK, and some of the methods have been renamed:
let button = UIButton()
button.setImage(UIImage(named: "Unchecked"), for: .normal)
button.setImage(UIImage(named: "Checked"), for: .selected)
You can also now use image literals with Xcode 8 instead of UIImage(named:):
#imageLiteral(resourceName: "Unchecked")
Swift 2:
Why not use the .Selected state of the button as the "checked" state, and the .Normal state as the "unchecked" state.
let button = UIButton()
button.setImage(UIImage(named: "Unchecked"), forState: .Normal)
button.setImage(UIImage(named: "Checked"), forState: .Selected)
// ...
#IBAction func buttonPressed(sender: AnyObject) {
if let button = sender as? UIButton {
if button.selected {
// set deselected
button.selected = false
} else {
// set selected
button.selected = true
}
}
}
You dont need to set selected in condition. I just doing with following method in swift:
func selectDeselect(sender: UIButton){
sender.selected = !sender.selected
if(sender.selected == true)
{
sender.setImage(UIImage(named:"select_heart"), forState: UIControlState.Normal)
}
else
{
sender.setImage(UIImage(named:"heart"), forState: UIControlState.Normal)
}
}
Here is Working code for swift 4.
Make Sure you need to connect Button IBAction Outlet as UIButton and set default button image from storyboard whatever you want.
#IBAction func btnTapped(_ sender: UIButton) {
if sender.currentImage == UIImage(named: "radio_unchecked"){
sender.setImage(UIImage(named: "radio_checked"), for: .normal)
}else{
sender.setImage(UIImage(named: "radio_unchecked"), for: .normal)
}
}
update for Swift 4+ :
let button = UIButton()
button.setImage(UIImage(named: "Unchecked"), forState: .Normal)
button.setImage(UIImage(named: "Checked"), forState: .Selected)
#IBAction func buttonPressed(sender: AnyObject) {
if let button = sender {
if button.isSelected {
// set deselected
button.isSelected = false
} else {
// set selected
button.isSelected = true
}
}
}
Set uncheck image on default state from storyboard and check image on selected state from storyboard.
#IBAction func buttonPressed(sender: AnyObject) {
buttonOutlet.isSelected = !buttonOutlet.isSelected
}
private(set) lazy var myButton: UIButton = {
let button = UIButton()
button.setImage(UIImage(named: "Unchecked"), for: .normal)
button.setImage(UIImage(named: "Checked"), for: .selected)
button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
button.translatesAutoresizingMaskIntoConstraints = false
return button
}()
#objc
func buttonTapped(sender: AnyObject) {
sender.isSelected.toggle()
}
To select only the pressed button out of three buttons and deselect the others when designated button is pressed.
#IBAction func buttonPressed(_ sender: UIButton) {
// Deselect all buttons
button1.isSelected = false
button2.isSelected = false
button3.isSelected = false
// Select the pressed button
sender.isSelected = true
}

UIButton text not staying changing

I am developing a simple iPhone app in Swift
I have a customUITableViewCell. In the cell I have a normal UIButton with text of "Hello World".
In my code for the custom cell, I have the following function:
#IBAction func buttonAction(sender: AnyObject) {
if likeButton.titleLabel?.text == "Hello World" {
likeButton.titleLabel?.text = "Hi!"
}
}
When I tap theUIButton, the text of theUIButton changes to "Hi!" for just a split second! And then it quickly changes back to "Hello World"...is there any way to fix that?
Why is it doing that?
Use UIButtons's setTitle: forState: rather than setting text on titleLabel of button. For Instance-
Initial set up
likeButton.setTitle("Hello World", forState: UIControlState.Normal)
On click set up-
#IBAction func buttonAction(sender: AnyObject) {
if likeButton.titleLabel?.text == "Hello World" {
likeButton.setTitle("Hi!", forState: UIControlState.Normal)
}
}
likeButton.setTitle("my text here", forState: UIControlState.Normal)
Use this code
Do Something like this :
#IBAction func buttonAction(sender: AnyObject) {
likeButton.setTitle("Hi!", forState: UIControlState.Normal)
}
it works here, hope also work there, set your default value-
yourButton.setTitle("Hello", forState: UIControlState.Normal)
when you tapped your button set this
#IBAction func buttonAction(sender: AnyObject) {
if yourButton.titleLabel?.text == "Hello " {
yourButton.setTitle("Max", forState: UIControlState.Normal)
}
}

Resources