Sebastijan B.
Sebastijan B.

Reputation: 83

UITextField not showing when added as subview in SpriteKit

I'm pretty new to Swift and I'm having some trouble displaying UITextField in SpriteKit. Init() in SceneMenu will not display the UITextField, while using function showTextField() with touchesBegan() works. How can I display UITextField without the user clicking the button Show TextField?

GameViewController.swift:

class GameViewController: UIViewController {

override func viewDidLoad() {
 
let scene = SceneMenu(size: view.frame.size)
scene.scaleMode = .aspectFill
scene.backgroundColor = .white
 
let view = view as! SKView
view.presentScene(scene)
 
}

}

SceneMenu.swift:

class SceneMenu: SKScene {

override init(size: CGSize) {
 
super.init(size: size)
 
let btnAlert = SKLabelNode(text: "Show TextField")
btnAlert.name = "btn_text"
btnAlert.fontSize = 20
btnAlert.fontColor = SKColor.blue
btnAlert.fontName = "Avenir"
btnAlert.position = CGPoint(x: size.width / 2, y: size.height / 2)
addChild(btnAlert)

let textFieldFrame = CGRect(origin: CGPoint(x: 100, y: 300), size: CGSize(width: 200, height: 30))
let textField = UITextField(frame: textFieldFrame)
textField.backgroundColor = SKColor.blue
textField.placeholder = "Type name"

view?.addSubview(textField)
 
}

required init?(coder aDecoder: NSCoder) {
 
fatalError("init(coder:) has not been implemented")
 
}

func showTextField() {
 
let textFieldFrame = CGRect(origin: CGPoint(x: 100, y: 100), size: CGSize(width: 200, height: 30))
let textField = UITextField(frame: textFieldFrame)
textField.backgroundColor = SKColor.blue
textField.placeholder = "Type name"

view?.addSubview(textField)
 
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
 
if let touch = touches.first {
   
  let location = touch.location(in: self)
  let action = atPoint(location)
   
  if action.name == "btn_text" {
     
    showTextField()
     
  }
   
}
 
}

 }

Upvotes: 0

Views: 65

Answers (1)

ChrisTech44
ChrisTech44

Reputation: 106

SKScene has a method that lets you setup the scene when you move to it. So, instead of using the custom class's initializer, override and use SKScene's didMove(to view: SKView) method. An example:

override func didMove(to view: SKView) {
        showTextField()
    }

Upvotes: 1

Related Questions