狛ログ

2021年3月30日火曜日

Swift・UIBarButtonItemのtitleを変更する。


こんにちは、オフィス狛 技術部のpinoです。


この度、初めてiOSアプリの開発に携わることができました。

まだまだ勉強中の身ですが、今回は「UIBarbuttonItemのtitleを変更する方法」について紹介したいと思います!


方法

早速ですが、UIBarbuttonItemのtitle変更方法です。

  1. private func setBarButtonItem() {
  2. // UIBarbuttonItemのactionを設定
  3. let button = UIBarButtonItem(title: "タイトル", style: .plain, target: self, action: #selector(self.buttonTapped(_:)))
  4. }
  5.  
  6. @objc func buttonTapped(_ sender: UIBarButtonItem) {
  7. // 変更後のタイトルを設定
  8. sender.title = "変更後のタイトル"
  9. }

タップ時の処理でUIBarButtonItemを引数にとって、
(仮引数名がsenderの場合)sender.title = "hoge"としてあげることでtitleの変更ができます。


...思いのほか、すごく簡単でしたね!
せっかくなので、ここからはこのtitle変更を活かしたものを作ってみたいと思います。


作るもの

以下のようなものを作っていきます。

  1. ・画面真ん中にTextFieldを配置
  2. ・TextField押下でキーボード表示。このキーボードの上にUIToolbarを配置
  3. ・UIToolbar上に並んでいるUIBarButtonItemタップで、キーボードタイプを切り替え

UIBarbuttonItemのtitle変更は、「UIBarButtonItemタップ」で発火するようにしてみます。


準備

Interfaceに「Storyboard」を選択して、プロジェクトを作成します。


画面真ん中にTextFieldを置いて、Keyboard Typeを「Number Pad」にしておきます。


ViewControllerで、TextFieldにUIToolbarを追加します。
ViewController.swift
  1. import UIKit
  2.  
  3. class ViewController: UIViewController {
  4.  
  5. @IBOutlet weak var sampleTextField: UITextField!
  6.  
  7. override func viewDidLoad() {
  8. super.viewDidLoad()
  9. self.setToolbar()
  10. }
  11. private func setToolbar() {
  12.  
  13. let toolbar = UIToolbar()
  14. toolbar.sizeToFit()
  15.  
  16. let inputSwitchButton = UIBarButtonItem(title: "英数字入力に切り替え", style: .plain, target: self, action: nil)
  17. let space = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
  18.  
  19. toolbar.items = [space, inputSwitchButton]
  20.  
  21. self.sampleTextField.inputAccessoryView = toolbar
  22. }
  23. }


ここまでで、「英数字入力に切り替え」というtitleのUIBarButtonItemが表示されるようになりました。


UIBarbuttonItemのtitle変更

UIBarButtonItemタップ時の処理を定義します。

ViewController.swift
  1. import UIKit
  2.  
  3. class ViewController: UIViewController {
  4.  
  5. @IBOutlet weak var sampleTextField: UITextField!
  6. // 中略
  7. private func setToolbar() {
  8.  
  9. let toolbar = UIToolbar()
  10. toolbar.sizeToFit()
  11.  
  12. let inputSwitchButton = UIBarButtonItem(title: "英数字入力に切り替え", style: .plain, target: self, action: #selector(self.inputSwitchButtonTapped(_:))) // 🍀変更
  13. let space = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
  14.  
  15. toolbar.items = [space, inputSwitchButton]
  16.  
  17. self.sampleTextField.inputAccessoryView = toolbar
  18. }
  19.  
  20. // 🍀追加
  21. @objc func inputSwitchButtonTapped(_ sender: UIBarButtonItem) {
  22. sender.title = "数字入力に切り替え"
  23. }
  24. }

inputSwitchButtonTapped()を定義して、その中でtitleの変更を行うようにしました。

さらに、inputSwitchButtonの#selectorに inputSwitchButtonTapped()を設定することで、
ボタンタップ時にtitleが「数字入力に切り替え」へと変更されるようになります。

ここまでで、実際の動きは以下のようになります。

1回タップした後は、特に変化がありませんね。

今回はtitleと一緒にKeyboard Typeも変更したいので、inputSwitchButtonTapped()を以下のように修正します。

  1. @objc func inputSwitchButtonTapped(_ sender: UIBarButtonItem) {
  2. // キーボードが表示されたままだとKeyboard Typeの変更が反映されないのでフォーカスを外す
  3. self.sampleTextField.resignFirstResponder()
  4. // 🍀以下の分岐を追加
  5. if self.sampleTextField.keyboardType == .numberPad {
  6. sender.title = "数字入力に切り替え"
  7. self.sampleTextField.keyboardType = .namePhonePad
  8. } else if self.sampleTextField.keyboardType == .namePhonePad {
  9. sender.title = "英数字入力に切り替え"
  10. self.sampleTextField.keyboardType = .numberPad
  11. }
  12. // Keyboard Typeを切り替えた後に再度フォーカスする
  13. self.sampleTextField.becomeFirstResponder()
  14. }

(フォーカスのつけ外しについては、コメントの通りです)
現在のKeyboard Typeを判定して、titleとKeyboard Typeが切り替わるようにしました。

完成!

完成形は、以下のようになります。




以上、UIBarbuttonItemのtitleを変更する方法について紹介しました。
参考になるとうれしいです。

,

0 件のコメント:

コメントを投稿