我刚刚接触过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)
}
}
答案 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 = ""
}
}