[iOS][tvOS] テキストフィールドが編集を終了した理由

2017.08.03

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

UITextFieldDidEndEditingReason

iOS 10 SDK から UITextField クラスに UITextFieldDidEndEditingReason という enum が追加されました。
当時「なんじゃこりゃあ?」と思って調べてみましたが、その頃はドキュメントに記載がなく、正体不明のまま迷宮入りとなりました。
最近ふと思い出して調べてみたところ、ドキュメントが更新されて謎が解明できたのでご紹介します。

使いどころ

この enum は UITextFieldDelegate の以下のメソッドで第二引数として渡されます。

optional func textFieldDidEndEditing(_ textField: UITextField, 
                              reason: UITextFieldDidEndEditingReason)

ぱっと見た感じ、このデリゲートメソッド以外では使用されていないようです。

このメソッドはテキストフィールドの編集(入力操作)が終了したときに呼ばれます。
その時 どういう理由で編集が終了したか を表す値がこの変数に代入されているわけです。

定数

UITextFieldDidEndEditingReason に定義されている定数は iOS と tvOS で異なります
iOS が 1 つ、tvOS が 2 つ。
iOS の定義に 1 つ追加したものが tvOS の定義となります。

iOS

@available(iOS 10.0, *)
public enum UITextFieldDidEndEditingReason : Int {


    case committed
}

tvOS

@available(tvOS 10.0, *)
public enum UITextFieldDidEndEditingReason : Int {


    case committed

    @available(tvOS 10.0, *)
    case cancelled
}

つまり iOS においては textFieldDidEndEditing() の第二引数である reason は常に committed であるため、このデリゲートメソッドを使用する意味はないと言っていいでしょう。

tvOS での動き

tvOS では UITextField は以下のような UI となっています。

テキストフィールドにフォーカスを当てクリックすると・・・

1

フルスクリーンの編集状態になる。

2

ところで、Apple TV の Siri Remote(リモコン)には MENU というボタンが存在します。
このボタンは主に 戻るキャンセル といったアクションを実行するためのものです。

3

さて、上記テキストフィールドの編集状態を終了させると reason の値はどうなるでしょうか。
答えは以下の通りです。

  • Done ボタン(ソフトウェア)をクリック
    • committed
  • MENU ボタン(ハードウェア)を押す
    • cancelled

どうやらこの値は ユーザーがテキストを確定させたか、または MENU ボタンを押して入力をキャンセルしたかを判定するために存在するようです。
どちらが実行されたかによってその後の処理を分岐させることができそうですね。

さいごに

というわけで、UITextFieldDidEndEditingReason という enum は「tvOS において テキスト入力が確定されたか、キャンセルされたかを判定するためのもの」ということがわかりました。
私は tvOS アプリの開発は行っていないので便利さがよくわからないのですが、この情報が誰かの役に立つことをただ祈るばかりです。

リンク

ミレニアム・ファルコン製作日記 #81

81 号 表紙

mfd_81_1

パーツ

mfd_81_2

mfd_81_3

mfd_81_4

成果

mfd_81_5

mfd_81_6

今回の作業は以下の 3 つでした。

  • 穴メカにディテールパーツを取り付ける
  • 左舷マンディブル下部を組み立てる
  • 穴メカを取り付ける

左舷マンディブルまわりの作業です。
穴メカを作成し、マンディブルのフレームに取り付けました。

マガジンを見てると、ディテールアップオプションの 塗装 はやっぱりやったほうがよかったかな―と思い始めてきました。
今度また機会があれば、ここらへんのウェザリングにも挑戦してみようと思います。

それではまた次回。

May the Force be with you!