Почему моя кнопка не работает в Swift Playgrounds?

#ios #swift #uibutton #swift-playground

#iOS #swift #uibutton #swift-игровая площадка

Вопрос:

Я пытаюсь создать игровую площадку, и у меня есть кнопка с надписью «Давайте поиграем!» и перемещается в новый контроллер просмотра.

Я просмотрел код с этого сайта и вставил его в свой код:

http://lab.dejaworks.com/ios-swift-3-playground-uibutton-action/

Это весь мой код (практически, полностью):

 import UIKit
import PlaygroundSupport

class MyViewController : UIViewController {
    override func loadView() {

        //Introduction



        let view = UIView()
        view.backgroundColor = .red


        //title

        func labelCool() {

        let label = UILabel()
        label.frame = CGRect(x: 50, y: 300, width: 400, height: 100)
        label.text = "Add-Add - A Wonderful Game!"
        //label.frame = CGRect(x: 150, y: 200, width: 200, height: 20)
        label.numberOfLines = 3
        label.font = UIFont(name: "HelveticaNeue-Bold", size: 30)

        UILabel.animate (withDuration: 10.0, animations:{
            label.textColor = .black
        })
        UILabel.animate(withDuration: 5.0, animations:{
            label.textColor = .blue
        })
        view.addSubview(label)

        }

        labelCool()

        //subtitle
        let subtitle = UILabel()
        subtitle.frame = CGRect(x: 50, y: 400, width: 200, height: 50)
        subtitle.text = "Curated and Created by Yours Truly, Adit Dayal!"
        subtitle.numberOfLines = 4
        self.view = view
        view.addSubview(subtitle)




    }

     override func viewDidLoad() {
        class Responder : NSObject {
            @objc func action() {
                print("Yay!")
            }
        }


        let responder = Responder()

        //next page
        let button = UIButton(frame : CGRect(x: 0, y: 500, width: 200, height: 50))
        button.setTitle("Let's Play!", for: .normal)
        button.backgroundColor = .blue
        button.addTarget(responder, action: #selector(Responder.action), for: .touchUpInside)
        view.addSubview(button)
    }

}

class gameViewController: UIViewController {

}







// Present the view controller in the Live View window
PlaygroundPage.current.liveView = MyViewController()
  

На данный момент я просто хочу, чтобы при нажатии на кнопку отображалось «Ура!», но это ничего не делает!
Кто-нибудь знает почему? (У меня небольшие временные ограничения)

Большое вам спасибо,

Adit Dayal

Комментарии:

1. Ваш класс ответчика находится внутри вашего viewDidLoad()

2. Помог ли вам мой ответ? Если да, можете ли вы отметить как лучший?

Ответ №1:

Ваш класс-ответчик находится внутри функции viewDidLoad(), которая выводит класс наружу следующим образом

 class Responder : NSObject {
    @objc func action() {
        print("Yay!")
    }
}

override func viewDidLoad() {
    let responder = Responder()

    //next page
    let button = UIButton(frame : CGRect(x: 0, y: 500, width: 200, height: 50))
    button.setTitle("Let's Play!", for: .normal)
    button.backgroundColor = .blue
    button.addTarget(responder, action: #selector(responder.action), for: .touchUpInside)
    view.addSubview(button)
}
  

Комментарии:

1. Привет! Итак, я попробовал это, но по-прежнему ничего не происходит… есть идеи относительно того, почему?

Ответ №2:

Проблема в том, что вы создаете объект-ответчик внутри viewDidLoad как локальную переменную; это приводит к уничтожению объекта при завершении функции (но мы хотим, чтобы этот объект был жив даже после). Вы должны сохранить этот объект, поэтому вместо создания локальной переменной создайте переменную экземпляра, просто сохранив ее как область видимости класса:

 class Responder : NSObject {
    @objc func action() {
        print("Yay!")
    }
}

let responder = Responder() // this is now outside the viewDidLoad, so it's an instance variable

override func viewDidLoad() {
    //next page
    let button = UIButton(frame : CGRect(x: 0, y: 500, width: 200, height: 50))
    button.setTitle("Let's Play!", for: .normal)
    button.backgroundColor = .blue
    button.addTarget(responder, action: #selector(Responder.action), for: .touchUpInside)
    view.addSubview(button)
}