I just learned Swift and developed an iOS project.
But the button title doesn't change when I click it. How can I change the title?
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var helloButton: UIButton!
@IBAction func showAlert(_ sender: Any) {
//var alert = UIAlertController(title: "Hello!", message: "Hello, world!",preferredStyle: UIAlertControllerStyle.Alert)
let alert = UIAlertController(title: "Hello", message: "Hello, world", preferredStyle: UIAlertController.Style.alert)
alert.addAction(UIAlertAction(title: "close", style: UIAlertAction.Style.default, handler: nil))
self.present(alert,animated:true,completion:nil)
// ❌ it didn't work
self.helloButton.setTitle("Clicked",for:.normal)
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
You haven't called for the function showAlert() in the code. You need to call the function as soon as the user clicks on that required button, for which you'll need to use a function which is called as soon as the click action happens and your required functionality is invoked and processed.
The above code just works fine, and the title changes. You can also update the title inside the alert handler as below.
@IBAction func helloButtonTapped(_ sender: Any) {
let alert = UIAlertController(title: "Hello", message: "Hello, world", preferredStyle: UIAlertController.Style.alert)
alert.addAction(UIAlertAction(title: "close", style: .default, handler: { (_) in
self.helloButton.setTitle("Clicked",for:.normal)
}))
self.present(alert,animated:true,completion:nil)}
I found the reason!
It was because the UIButton title being 【Attributed】 or 【Plain】.
✅Different attribute has different API to change the title
If it is 【Attributed】: We should change the UIButton title by:
//
// ViewController.swift
// HelloCocoa
//
// Created by LearnChild on 2021/4/14.
//
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var helloButton: UIButton!
@IBAction func showAlert(_ sender: Any) {
// var alert = UIAlertController(title: "Hello!", message: "Hello, world!",preferredStyle: UIAlertControllerStyle.Alert)
let alert = UIAlertController(title: "Hello", message: "Hello, world", preferredStyle: UIAlertController.Style.alert)
alert.addAction(UIAlertAction(title: "close", style: UIAlertAction.Style.default, handler: nil))
self.present(alert,animated:true,completion:nil)
// if UIButton title is Plain
// self.helloButton.setTitle("Clicked",for:.normal)
// if UIButton title is Attributed✅👇
let myNormalAttributedTitle = NSAttributedString(string: "Click Here",
attributes: [NSAttributedString.Key.foregroundColor : UIColor.blue])
self.helloButton.setAttributedTitle(myNormalAttributedTitle,for:.normal)
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
}
And if it's 【Plain】:
//
// ViewController.swift
// HelloCocoa
//
// Created by LearnChild on 2021/4/14.
//
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var helloButton: UIButton!
@IBAction func showAlert(_ sender: Any) {
// var alert = UIAlertController(title: "Hello!", message: "Hello, world!",preferredStyle: UIAlertControllerStyle.Alert)
let alert = UIAlertController(title: "Hello", message: "Hello, world", preferredStyle: UIAlertController.Style.alert)
alert.addAction(UIAlertAction(title: "close", style: UIAlertAction.Style.default, handler: nil))
self.present(alert,animated:true,completion:nil)
// if UIButton title is Plain✅👇
self.helloButton.setTitle("Clicked",for:.normal)
// if UIButton title is Attributed✅
// let myNormalAttributedTitle = NSAttributedString(string: "Click Here",
// attributes: [NSAttributedString.Key.foregroundColor : UIColor.blue])
// self.helloButton.setAttributedTitle(myNormalAttributedTitle,for:.normal)
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
}
Thanks to everyone who helped!
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.