Home > Software engineering >  UITextField not showing when added as subview in SpriteKit
UITextField not showing when added as subview in SpriteKit

Time:06-06

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

 }

CodePudding user response:

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()
    }
  • Related