Home > Net >  swift can't find textfield in scope even when its in the same viewController
swift can't find textfield in scope even when its in the same viewController

Time:10-04

I need to print value of txtField after clicking the button, txtField is on the viewcotroller but xcode returns an error cannot find 'txtField' in scope but they are in the same view

    override func viewDidLoad() {
        super.viewDidLoad()
        let button = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 50))
        button.backgroundColor = .green
        button.setTitle("Test Button", for: .normal)
        button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
        self.view.addSubview(button)
        var txtField: UITextField = UITextField()
        txtField.frame = CGRect(x: 50, y: 70, width: 200, height: 30)
        txtField.backgroundColor = UIColor.gray
        
        self.view.addSubview(txtField)
    }
    
    @objc func buttonAction(sender: UIButton!) {
        print(txtField.text)
    }

CodePudding user response:

Actually, no, it's not in scope. Your var txtField is inside the viewDidLoad function. No other function's code can see inside this function, so the variable is not in scope from within another function such as your buttonAction.

In general the rule that things inside a scope can see only things that at a higher level of scope. If var txtField appeared outside both viewDidLoad and buttonAction (i.e. an instance property), then code inside both would be able to see it.

It's an easy move to make:

var txtField: UITextField = UITextField()
override func viewDidLoad() {
    super.viewDidLoad()
    let button = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 50))
    button.backgroundColor = .green
    button.setTitle("Test Button", for: .normal)
    button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
    self.view.addSubview(button)
    txtField.frame = CGRect(x: 50, y: 70, width: 200, height: 30)
    txtField.backgroundColor = UIColor.gray
    
    self.view.addSubview(txtField)
}

@objc func buttonAction(sender: UIButton!) {
    print(txtField.text)
}

CodePudding user response:

In your code txtField is declared in viewDidLoad on line

var txtField: UITextField = UITextField()

Therefore out of the scope of buttonAction.

To mitigate this place

txtField

out of scope as a global variable

CodePudding user response:

The error is that are in 2 different function, override or @objc doesn't change this simple thing. So move the txtField initialization outside them so can be readed or written by both.

var txtField: UITextField = UITextField()

override func viewDidLoad() {
        super.viewDidLoad()
        let button = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 50))
        button.backgroundColor = .green
        button.setTitle("Test Button", for: .normal)
        button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
        self.view.addSubview(button)
        
        txtField.frame = CGRect(x: 50, y: 70, width: 200, height: 30)
        txtField.backgroundColor = UIColor.gray
        
        self.view.addSubview(txtField)
    }
    
    @objc func buttonAction(sender: UIButton!) {
        print(txtField.text)
    }
  • Related