How to make a button that will print words when i press it.

I want to make a truth or dare game in swift playground for iPad but I can't make a button that prints more than one dare or truth. I tried to make a var that have all dares and then i put it in the (class Responser NSObject )the var looks like this( var dares = ["dare1", "dare 2" ...]) but it is giving me error that says (cannot assign value of type '[String]'to type 'String') and the 2nd thing I tried was (let dares = ["dare 1", "dare 2"…]) that gave me the same error. my code looks like this



import PlaygroundSupport

import UIKit



let View = UIView()



View.backgroundColor = .blue





let lbl = UILabel(frame: CGRect(x: 210, y: 329, width: 200, height: 50))

lbl.text = "hi!"

View.addSubview(lbl)

lbl.textColor = .white





let button = UIButton(frame: CGRect(x: 67, y: 500, width: 100, height: 50))

button.backgroundColor = .green

//button.setTitleColor(#colorLiteral(red: 0.0, green: 0.0, blue: 0.0, alpha: 1.0), for: UIControlState.selected)

button.setTitle("button", for: UIControl.State.selected)

button.layer.cornerRadius = 10

View.addSubview(button)



let button1 = UIButton(frame: CGRect(x: 300, y: 500, width: 100, height: 50))

button1.backgroundColor = .red

//button1.setTitleColor(#colorLiteral(red: 0.0, green: 0.0, blue: 0.0, alpha: 1.0), for: UIControlState.selected)

button1.setTitle("button1", for: UIControl.State.selected)

button1.layer.cornerRadius = 10

View.addSubview(button1)





class Responser: NSObject

{

    

    //Method to be called

    @objc func printname()

    {

        lbl.text = "1"

    }

}



let responder = Responser()

button.addTarget(responder, action: #selector(Responser.printname), for:.touchUpInside)  



class Responser1: NSObject

{

    

    //Method to be called

    @objc func printname()

    {

        lbl.text = "2"

    }

}



let responder1 = Responser1()

button1.addTarget(responder1, action: #selector(Responser1.printname), for:.touchUpInside)





PlaygroundPage.current.liveView = View






Answered by Claude31 in 686952022

OK. I see where you got the code : https://stackoverflow.com/questions/39878959/how-to-get-a-uibutton-to-perform-action-in-a-swift-playground

And they do set the view frame.

To get a random value, you could change class definitions as:

class Responser: NSObject {

    @objc func printname() {
        let value = (11...20).randomElement() ?? 2
        lbl.text = "\(value)"
    }
}


class Responser1: NSObject {

    @objc func printname() {
        let value = (1...10).randomElement() ?? 2
        lbl.text = "\(value)"
    }
}

Note: a single class should be enough. Make the distinction between 2 buttons with a tag.

Code becomes:

import PlaygroundSupport
import UIKit

let view = UIView(frame: CGRect(x: 0, y: 20, width: 450, height: 600))

view.backgroundColor = .blue

let lbl = UILabel(frame: CGRect(x: 210, y: 329, width: 200, height: 50))
lbl.text = "hi!"
view.addSubview(lbl)
lbl.textColor = .white

let button = UIButton(frame: CGRect(x: 67, y: 500, width: 100, height: 50))
button.backgroundColor = .green
//button.setTitleColor(#colorLiteral(red: 0.0, green: 0.0, blue: 0.0, alpha: 1.0), for: UIControlState.selected)
button.setTitle("button", for: UIControl.State.selected)
button.layer.cornerRadius = 10
view.addSubview(button)

let button1 = UIButton(frame: CGRect(x: 300, y: 500, width: 100, height: 50))
button1.backgroundColor = .red
button1.setTitle("button1", for: UIControl.State.selected)
button1.layer.cornerRadius = 10
view.addSubview(button1)

class Responser: NSObject {
    var tag: Int = 0

    //Method to be called
    @objc func printname() {
        var value = 0
        switch tag {
        case 1: value = (1...10).randomElement() ?? 1
        case 2: value = (11...20).randomElement() ?? 2
        default: value = 0
        }

        lbl.text = "\(value)"
    }

}

let responder = Responser()
responder.tag = 1
button.addTarget(responder, action: #selector(Responser.printname), for:.touchUpInside)

let responder1 = Responser()
responder1.tag = 2
button1.addTarget(responder1, action: #selector(Responser.printname), for:.touchUpInside)

PlaygroundPage.current.liveView = view

When you paste code here, better use Paste and Match Style, to avoid all extra lines.

You did not initialise view frame: so it cannot work. Note: call it view, not View.

I have modified the code to make it work:

import PlaygroundSupport
import UIKit

let view = UIView(frame: CGRect(x: 0, y: 20, width: 400, height: 600))   // <<-- NEEDED

view.backgroundColor = .blue

let lbl = UILabel(frame: CGRect(x: 210, y: 329, width: 200, height: 50))
lbl.text = "hi!"
view.addSubview(lbl)
lbl.textColor = .white

let button = UIButton(frame: CGRect(x: 67, y: 500, width: 100, height: 50))
button.backgroundColor = .green
//button.setTitleColor(#colorLiteral(red: 0.0, green: 0.0, blue: 0.0, alpha: 1.0), for: UIControlState.selected)
button.setTitle("button", for: UIControl.State.selected)
button.layer.cornerRadius = 10
view.addSubview(button)

let button1 = UIButton(frame: CGRect(x: 300, y: 500, width: 100, height: 50))
button1.backgroundColor = .red
//button1.setTitleColor(#colorLiteral(red: 0.0, green: 0.0, blue: 0.0, alpha: 1.0), for: UIControlState.selected)
button1.setTitle("button1", for: UIControl.State.selected)
button1.layer.cornerRadius = 10
view.addSubview(button1)

class Responser: NSObject {
    //Method to be called

    @objc func printname() {

        lbl.text = "1"
    }

}

let responder = Responser()
button.addTarget(responder, action: #selector(Responser.printname), for:.touchUpInside)

class Responser1: NSObject {

    //Method to be called

    @objc func printname() {
        lbl.text = "2"

    }

}

let responder1 = Responser1()
button1.addTarget(responder1, action: #selector(Responser1.printname), for:.touchUpInside)

PlaygroundPage.current.liveView = view

I really don't understand why you create classes as Responser and Responser1.

Probably, everything can be done directly in the buttons target actions.

I do not understand either what you want to achieve:

make a button that prints more than one dare or truth.

How do you want to select the answer ? Randomly ? On some condition ?

Please clarify so that we can help.

Accepted Answer

OK. I see where you got the code : https://stackoverflow.com/questions/39878959/how-to-get-a-uibutton-to-perform-action-in-a-swift-playground

And they do set the view frame.

To get a random value, you could change class definitions as:

class Responser: NSObject {

    @objc func printname() {
        let value = (11...20).randomElement() ?? 2
        lbl.text = "\(value)"
    }
}


class Responser1: NSObject {

    @objc func printname() {
        let value = (1...10).randomElement() ?? 2
        lbl.text = "\(value)"
    }
}

Note: a single class should be enough. Make the distinction between 2 buttons with a tag.

Code becomes:

import PlaygroundSupport
import UIKit

let view = UIView(frame: CGRect(x: 0, y: 20, width: 450, height: 600))

view.backgroundColor = .blue

let lbl = UILabel(frame: CGRect(x: 210, y: 329, width: 200, height: 50))
lbl.text = "hi!"
view.addSubview(lbl)
lbl.textColor = .white

let button = UIButton(frame: CGRect(x: 67, y: 500, width: 100, height: 50))
button.backgroundColor = .green
//button.setTitleColor(#colorLiteral(red: 0.0, green: 0.0, blue: 0.0, alpha: 1.0), for: UIControlState.selected)
button.setTitle("button", for: UIControl.State.selected)
button.layer.cornerRadius = 10
view.addSubview(button)

let button1 = UIButton(frame: CGRect(x: 300, y: 500, width: 100, height: 50))
button1.backgroundColor = .red
button1.setTitle("button1", for: UIControl.State.selected)
button1.layer.cornerRadius = 10
view.addSubview(button1)

class Responser: NSObject {
    var tag: Int = 0

    //Method to be called
    @objc func printname() {
        var value = 0
        switch tag {
        case 1: value = (1...10).randomElement() ?? 1
        case 2: value = (11...20).randomElement() ?? 2
        default: value = 0
        }

        lbl.text = "\(value)"
    }

}

let responder = Responser()
responder.tag = 1
button.addTarget(responder, action: #selector(Responser.printname), for:.touchUpInside)

let responder1 = Responser()
responder1.tag = 2
button1.addTarget(responder1, action: #selector(Responser.printname), for:.touchUpInside)

PlaygroundPage.current.liveView = view
How to make a button that will print words when i press it.
 
 
Q