编辑时如何根据TextField内容更改标签文本

时间:2018-08-09 20:00:42

标签: ios swift xcode label textfield

我刚刚接触过Swift,并且正在尝试学习一些非常基础的知识。

我正在努力实现这一目标:

我有一个TextField和一个Label,并且我希望根据TextField文本(应为国家/地区名称)将Label设置为特定的表情符号。

示例:

如果TextField包含单词“意大利”,我希望将标签设置为“”。

如果TextField包含单词“ Mexico”,则应将Label设置为“”。

这应该在编辑TextField时发生,而不是使用任何按钮来确认其中的文本。

这是我的代码(显然不起作用)。

@IBOutlet weak var emojiLabel: UILabel!
@IBOutlet weak var myTestField: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    changeLabel()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func changeLabel() {

    emojiLabel.text = ""
    var countryName = myTestField.text

    if (countryName == "Italia") {
        emojiLabel.text = ""
        print (emojiLabel)
    }

}

2 个答案:

答案 0 :(得分:1)

您要做的第一件事就是设置一个字典,其中包含所有想要的对,例如:

    //Put this line outside of viewDidLoad
    var dictionary: [String: String] = [:]

    //Put these lines inside of viewDidLoad
    dictionary["Italy"] = ""
    dictionary["Mexico"] = ""
    //...Add more pairs to the dictionary

现在您已经定义了所有对,接下来要做的是设置文本字段的委托。这样做使您每当在文本字段中输入文本时都可以运行一些代码块。首先,在视图控制器类定义中,您要符合 UITextFieldDelegate

class ViewController: UIViewController, UITextFieldDelegate {
    //...rest of the code in the view controller
}

然后,在您的 viewDidLoad 中,您想要将文本字段的委托设置为 self (又称此视图控制器,我们刚刚符合UITextFieldDelegate ):

override func viewDidLoad() {
    super.viewDidLoad()
    //...rest of code in viewDidLoad
    myTestField.delegate = self
}

现在,所有这些事情我们都想调用此函数,只需开始输入textfield,它就会自动完成,因为我们已经符合UITextFieldDelegate:

func textFieldDidEndEditing(_ textField: UITextField) {
    //...This function is called EVERY time editing is finished in myTestField
}

好,因此在 textFieldDidEndEditing 函数内部,我们要做的就是检查在myTestField中输入的内容,并查看它是否与第一步中创建的词典中的任何键均匹配。 ..如果可以,那么我们最终将更新标签:

func updateLabel(textField: UITextField) {
    //we are using guard here because we are dealing with optional values, 
    //meaning that textField.text doesn't necessarily have a value, and  
    //dictionary[text] may not actually have a value either.
    guard let text = textField.text,
        let labelText = dictionary[text] else {return}
    //Now we are going to actually update our label
    emojiLabel.text = labelText
}

好,看起来不错,最后要做的就是在textFieldDidEndEditing函数内部调用我们的updateLabel函数:

func textFieldDidEndEditing(_ textField: UITextField) {
    //...This function is called EVERY time editing is finished in myTestField
    updateLabel(textField: textField)
}

就是这样!

答案 1 :(得分:0)

我感谢Teetz的评论。 如果有人需要,这是我的工作代码:

编辑1:我强烈建议使用标记为答案的Greg解决方案。

@IBOutlet weak var emojiLabel: UILabel!
@IBOutlet weak var myTestField: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    myTestField.addTarget(self, action: #selector(ViewController.textFieldDidChange(_:)), for: UIControlEvents.editingChanged)
    textFieldDidChange(myTestField)

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

@objc func textFieldDidChange(_ textField: UITextField) {

    emojiLabel.text = ""
    var countryName = myTestField.text

    if (countryName == "Italia") {
        emojiLabel.text = ""
    }

}