読者です 読者をやめる 読者になる 読者になる

Swiftで遊ぼう! on Hatena

あしたさぬきblogでやってた初心者オヤジのiOSプログラミング奮闘記がHatenaに来ました

Swiftで遊ぼう! - 972 - 分かった気でいるけど本当はどうなんだろう?

昨日「複数のTextFieldからセグエの切り替えができるようになった!」なんて偉そうな事言っていましたが、本質は理解していないんで、本当に理解できている人がいらっしゃれば教えてもらいたいです。

私の書いたコーディングの概要を説明します。

トーリーボード上のベースになるView Controllerに2つのUITextViewを設置します。ストーリーボードに設置したオブジェクトからViewController.swiftに「Ctrl + ドラッグ」して@IBOutletプロパティを作ります。それぞれ「birthTextField」と「idField」と名前をつけます。次に2つのUIViewControllerをオブジェクト・ライブラからストーリーボードに設置して「Date Popover Controller」と「Numpad View Controller」に変更します。カスタムUIViewControllerはSwiftで遊ぼう! - 270 - カスタムViewControllerの作成法 - Swiftで遊ぼう! on Hatenaで説明しているように用意します。

次にそれぞれのTextFieldからViewControllerに「Ctrl + ドラッグ」してセグエを作ります。Popoverを使いたいので、表示されるメニューから「Present As Popover」を選ぶだけです。ストーリーボードのSegueを選択してIdentifierを「Show Datepopover」と「Show Numpadpopover」にするだけでセグエのインスタンス化がされます。そうなんです。ストーリーボードを使った場合はコードを書かなくてもこれでセグエが作られることになります。

f:id:yataiblue:20170509191211j:plain

ViewController.swiftで「prepare(for segue:UIStoryboardSegue, sender:Any!) 」をオーバーライドするだけでPopoverをインスタンス化できます。

しかし、実際のところ奇妙な現象が生じるんです。

このままランしてシュミレーションを実行します。birthTextFieldとidFieldのどちらかをクリックすると、基本的にデフォルトのキーボードが画面下部からせり出してきます。デフォルトの状態ではキーボードの制御もできません。さらにどちらかのテキストフィールドを選択するとランダムにどちらかのセグエが実行されるためどのTextFieldがクリックされているのか判断させることができないんです。

クリックされたTextFieldを判断させるには以下のデリゲーション・メソッドを使用する必要があります。

func textFieldShouldBeginEditing(_ textField: UITextField)
         -> Bool {
    switch textField {
    case birthTextField:
        performSegue(withIdentifier: "Show Datepopover", 
                             sender: self)
        print("Birth Text Field was selected")
    case idField:
        performSegue(withIdentifier: "Show Numpadpopover", 
                             sender: self)
        print("Id Field was selected")
    default:
        break
    }
    return false
}

これでTextFieldを選別することができます。

しかし、ここで疑問が1つ生じます。「 performSegue(withIdentifier: String, sender: Any?)」はコーディングでセグエを生成する方法であり、ストリーボードを使ってセグエを生成している場合は必要無いはずです。とすれば重複していることになるのですが、performSegueを使用しないでTextFieldを選別できないんでしょうか?