#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)
}