UIButton not reacting to first press in Swift - ios

I am working on a simple (ok, it should be simple) calculator that estimates risk based on a few inputs (toggle on/off)
Everything is working properly, except that the UIButtons need to be tapped 2 times to toggle initially. After that, the UIButtons work as expected.
Here is the code (contained within viewDidLoad())
#IBOutlet weak var confusionButton: UIButton!
var counter = 0
var confusionToggle = 0
and here is the action
#IBAction func pressConfusion(sender: UIButton) {
if confusionToggle == 0 {
confusionButton.backgroundColor = UIColor.clearColor()
confusionButton.alpha = 1;
confusionToggle++;
counter++;
} else {
confusionButton.backgroundColor = UIColor.grayColor()
confusionButton.alpha = 0.5;
confusionToggle = 0
counter--;
}
}
Any thoughts on this one? My Swift skills are very limited (my first attempt with Swift)

Think your just getting yourself confused. Use print statements to first understand what is happening, then do all your fancy button UI changes.
#IBAction func tapButton(sender: UIButton) {
// user println to help debug
println(confusionToggle)
if confusionToggle == 0 {
sender.backgroundColor = UIColor.grayColor()
sender.alpha = 0.5;
confusionToggle++;
counter++;
}
else {
// RESET
sender.backgroundColor = UIColor.clearColor()
sender.alpha = 1;
confusionToggle = 0
counter--;
}
}

I don't know what you trying to do.
Just let you know that confusionToggle will be 0 at first time. So, when you click on the button your first condition will be called, It will clear the background color and increase the value of confusionToggle to 1 then after it's because of 1 it will not go to the first condition. So, it goes to else part and give the background color to the gray. confusionToggle again goes to 0.
And it will iterate every time like 0 - 1 - 0 - 1 ...
If you want to do gray color to the button when you tap then you have to change your logic.
if confusionToggle == 0 {
confusionButton.backgroundColor = UIColor.grayColor()
confusionButton.alpha = 0.5;
confusionToggle = 1;
counter++;
} else {
confusionButton.backgroundColor = UIColor.clearColor()
confusionButton.alpha = 1;
confusionToggle = 0
counter--;
}
Hope it helps to you.

Related

Display color on different buttons

So I am making a quiz app, and I am using the following code to display to the user if the answer is correct or wrong.
The app looks like this:
Image here
This is the code to display:
#IBAction func checkAnswer(_ sender: UIButton) {
if let question = currentQuestion, let answer = sender.titleLabel?.text {
if (question.validateAnswer(to: answer)) {
score.incrementCorrectAnswers()
currentScore = currentScore + 1
feedbackLabel.textColor = UIColor(red:0.15, green:0.61, blue:0.61, alpha:1.0)
feedbackLabel.text = "Correct!"
scoreLabel.text = "\(currentScore)"
sender.backgroundColor = hexStringToUIColor(hex: "213F4B")
} else {
score.incrementIncorrectAnswers()
feedbackLabel.textColor = UIColor(red:0.82, green:0.40, blue:0.26, alpha:1.0)
feedbackLabel.text = "Wrong, correct answer is: \n\(currentQuestion!.getAnswer())"
sender.shake()
sender.backgroundColor = hexStringToUIColor(hex: "3F2F4B")
}
answer1Button.isEnabled = false
answer2Button.isEnabled = false
answer3Button.isEnabled = false
answer4Button.isEnabled = false
nextQuestionButton.isEnabled = true
feedbackLabel.isHidden = false
}
}
When using this, if the user tap the wrong button, the button turns red, and if the user taps the correct button, the button turns green. How can I make it so if the user taps the wrong button, the answer on the correct button turns green at the same time as the wrong one goes red? Let me know if any other code from project is necessarily.
You could loop through all UIButton's and check for sender.titleLabel?.text like this:
for view in self.view.subviews as [UIView] {
if let btn = view as? UIButton {
if btn.titleLabel?.text == currentQuestion!.getAnswer() {
btn.backgroundColor = hexStringToUIColor(hex: "213F4B") // Green Color
}
}
}
I'm not on my computer so won't be able to test it, so try it out and let me know how it works.

Swift change the position of a button

In the following piece of code I try to move a button and update the score label.
When I move the button the button moves exactly as I intended, but when I update the label as well the button just stays on the same coordinates.
In the piece of code below everything works great.
#IBAction func clickButtonTapped(_ sender: Any) {
if inGame == false {
segmentedControl.isHidden = true
inGame = true
score = 0
} else {
clickButton.isHidden = true
let height = arc4random_uniform(UInt32(screenHeight))
let width = arc4random_uniform(UInt32(screenWidth))
clickButton.center.x = CGFloat(width)
clickButton.center.y = CGFloat(height)
score += 1
clickButton.isHidden = false
}
}
But when I add this below score += 1 the button does not move anymore.
scoreDisplay.text = String(score)
How can I get the button to move and get to scoreDisplay updated?

When I press a button in my app ,the whole app freezes

My app has 3 components:
A textfield where the user enters a number to see if the number is prime or not
A button that when pressed does an action to determine if the number is prime or not
A label that shows whether the number is prime or not
When the button is pressed, the whole app freezes(but does not crash)and I have no idea why. I tried searching about this online, but none have solved my problem.Is there anything I can check for errors, or what reasons can a button freeze an app.
Here is my code:
import UIKit
class ViewController: UIViewController {
#IBOutlet weak var text: UITextField!
#IBOutlet weak var label: UILabel!
var i = 2
#IBAction func buttonPressed(_ sender: Any) {
if let userEnteredText = text.text{
var isPrime = true
let number:Int = Int(userEnteredText)!
while i < number{
if number % i == 0{
isPrime = false
i = i + 1
}
if isPrime == true{
label.text = "\(number) is Prime"
label.textColor = UIColor.black
}else{
label.text = "\(number) is not Prime"
label.textColor = UIColor.black
}
}
}else{
label.text = "Error-Enter a positive integer"
label.textColor = UIColor.red
}
}
}
Because the i++ should be outside of the if statement
...
while i < number{
i = i + 1
if number % i == 0 {
isPrime = false
}
...
Please note : Since you are trying to compute something that can take sometimes, you'll have(when you learn a little more) to do this kind of computation outside of the main thread. Your apps locks because you are blocking the main thread which is the one controlling the UI/touch/interaction of your app. Look into dispatch_async
PPS : Learn how to point break point in XCode and step over/into, you'll be able to debug the flow of your app.

Getting UIButton to stay highlighted after tap

I'm trying to replicate the scroll selector at the bottom of the emoji keyboard, where you can select the category by tapping on the appropriate icon and it will also show you in which category you are if you scroll. However, I'm having trouble getting the selected button to appear highlighted for some reason. I can get the scroll to work fine, but when I click on the icon it won't stay highlighted. Is this to do with some property of the touchUpInside trigger and the highlighted property?
My Code
var categoryButtons = [UIButton]()
var categoryDistances = [CGFloat]()
func scrollViewDidScroll(_ scrollView: UIScrollView) {
var curIndex = -1
for d in categoryDistances {
if (scrollView.contentOffset.x + 5 >= d) {
curIndex += 1
}
}
for b in categoryButtons {
b.isHighlighted = false
}
if (curIndex == -1) {
curIndex = 0
}
categoryButtons[curIndex].isHighlighted = true
}
func shortcutSelected(_ sender: UIButton) {
snapSelector.contentOffset.x = categoryDistances[categoryButtons.index(of: sender)!]
for b in categoryButtons {
b.isHighlighted = false
}
sender.isHighlighted = true
}
Got it to work the way I wanted by applying a tint color instead of using the isHighlighted or isSelected properties:
let tintedImg = origImg?.withRenderingMode(UIImageRenderingMode.alwaysTemplate)
let shortcut = UIButton()
shortcut.setBackgroundImage(tintedImg, for: .normal)
shortcut.tintColor = UIColor.gray

How to clear a UITextView with a UIButton

I am attempting to make a UIButton that will clear a UITextView that I have set for the output. When the user has seen what they want to see, they click OK and it clears it and they can start again. The code I have set up for it is this and I can not figure out why it will not work, I just click the button a hundred times and nothing happens.
#IBAction func okButton(sender: UIButton) {
resultOutputLabel.text == ""
}
Not == , you should use =
resultOutputLabel.text = ""
For assign a value you should use = sign, == use for comparison purpose. Such as
let a = 5
let b = 5
if a == b {
// a value = b value
}

Resources