Swift以下のように、title
のbutton
を取得しようとしました。
@IBAction func buttonAction(_ sender: Any) {
let buttonTitle = sender.titleForState(.Normal)!
}
送信者の後に.
を押してもhint
が表示されない場合でも機能しませんでした。
Swift 3.0でこれを行う正しい方法は何ですか
または、IBOutlet
を作成し、そのcurrentTitle
を使用すると、以下のように正常に動作します。上記のsender.
で取得できない理由
@IBOutlet var thebutton: UIButton!
@IBAction func buttonAction(_ sender: Any) {
let buttonTitle = thebutton.currentTitle!
print(buttonTitle)
}
パラメータsenderはAny
ではなくUIButton
型であるためです。メソッドシグネチャを次のように変更します。
@IBAction func buttonAction(_ sender: UIButton) {
if let buttonTitle = sender.title(for: .normal) {
print(buttonTitle)
}
}
そして、あなたは行ってもいいはずです。
Swift 3.0の現在の状態に関係なくボタンのタイトルを取得するには、これを使用してみます:
@IBAction func buttonPressed(_ sender:UIButton){
let buttonTitle = sender.titleLabel?.text
print("\(String(describing: buttonTitle)")
}
これは、ボタンの現在の状態に基づいて、状態のタイトルを返します。
警告を解決するために、次のコードを使用できます。
@IBAction func buttonAction(_ sender: UIButton) {
let buttonTitle = sender.title(for: .normal) ?? String()
print(buttonTitle)
}
ボタンに通常のタイトルが付いている場合は、次を使用できます。
button.title(for: state) // probably UIControl.State.normal
UIButton
に属性付きのタイトルがある場合は、使用する必要があります。
self.attributedTitle(for: state)
または、より一般的な拡張機能を使用できます。
extension UIButton {
func titleForState(_ state: UIControl.State = .normal) -> String? {
if let title = self.title(for: state) {
return title
}
if let attribTitle = self.attributedTitle(for: state) {
return attribTitle.string
}
return nil
}
}
Swift 3.0なので、
sender.titleForState(.Normal)! >> sender.title(for:.normal)!
AnyをAnyObjectに変更します。
@IBAction func buttonPressed(_ sender: AnyObject) {
let title = sender.title(for: .normal)!
print("\(title) button pressed")
}
Swift 5.0を使用した最もスマートなバージョン:
@IBAction func buttonAction(_ sender: UIButton) {
print(sender.currentTitle)
}
@IBAction func buttonPressed(_ sender: AnyObject) {
let title = sender.title(for: .normal)
print("\(title) button pressed")
}
つまり、これはSwift 4.0の場合であり、最後のものではありません。