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

Swiftで遊ぼう! on Hatena

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

Swiftで遊ぼう! - 974 - Popoverのサイズ考察

Popoverのサイズの調整もできるようになりました。

また一歩前進。

f:id:yataiblue:20170509181417j:plain

先日まで無駄に大きく広がっていたPopoverのウインドウサイズを次のように変更できました。

f:id:yataiblue:20170512083635j:plain

しかし、適当にレイアウトを調整しただけでは駄目なんでしょうね。ボタンの大きさやレイアウトをどうすればいいのかちょっと調べました。

www.dotproof.jp

なるほど、ちょっとしたレイアウト調整でもちゃんと考えて設定した方がいいようですね。上の崩れたレイアウトを次のように変更しました。

f:id:yataiblue:20170512144506j:plain

なんかすっきりしました。

Swiftで遊ぼう! - 973 - Popoverのまとめを改訂

「Swiftで遊ぼう!」シリーズ最初の記事を振り返ってみた。

Swiftで遊ぼう! - 1 class and structure:Life-LOG OtherSide

この記事は2104年7月9日に書かれていますが、あの頃は本当に何も分からず超ド素人でした。

今までコツコツ勉強を続けてここまで理解できたのが不思議です。

「継続は力なり」を実践しているだけ。「毎日ブログ更新」も目標にしてきましたが、これは先日潰えてしまいました(T_T) 

しかし、「継続は力なり」の本質は「諦めない」意気込みです。たとえ失敗しても突き進むのみ。当初はアプリ発表に3年という期間を目標に立てましたが、どうも7月9日までにアプリを発表できそうにもありません(T_T)

それでも続けるだけです!

ということでPopoverの復習をしました。

yataiblue.hatenablog.com

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を選別できないんでしょうか?

Swiftで遊ぼう! - 971 - UITextFieldを考える

いままで勉強のためにチュートリアルに取り組んでいましたが、いくらチュートリアルをこなしても実践的な能力は身につきませんね。

オリジナルプロジェクトを立ち上げてプログラミングをはじめると、チュートリアルで学んだiOSフレームワークの知識だけでは太刀打ちできず初っぱなから行き詰まってます(T_T)

UITextFieldクラス利用も色々と知らなければならないことがあります。

UITextFieldはUILabelと異なりユーザーからの入力を受け付けて反応することができ、そういう流れからUITextFieldにはデリゲーション・メソッドが用意されています。

プログラミング初心者は「デリゲーション・メソッド」と言われてもちんぷんかんぷんだと思います。今まで基本概念を学んできた私は違和感なく理解できるんですが、それはコツコツとチュートリアルを勉強してきたからです。

デリゲーションは日本語で言えば「委譲」です。委譲はOOP(オブジェクト指向プログラミング)の中核概念の1つです。

オブジェクト指向でなぜつくるのか 第2版

オブジェクト指向でなぜつくるのか 第2版

上記の本によれば、OOPの3大特徴が「クラス」「ポリモーフィズム」そして「継承」です。特にポリモーフィズム(多様性)がiOSフレームワークでふんだんに利用されているんです。

クラス継承を超えたつながりを作るための概念がポリモーフィズムで、Swift言語では「プロトコール&デリゲーション」と「エクステンション」が用意されています。特にプロトコール&デリゲーションは基本中の基本にあたります。
yataiblue.hatenablog.com
デリゲーション・メソッドを利用するためにUITextFieldとViewControllerの繋がりを用意する必要があります。

この準備の仕方にも基本的にストーリーボードの利用とコーディングによる方法があるので混乱しないように注意が必要です。

教科書を読んでチュートリアルをこなせばここまでの基本的な流れは理解できます。しかし、これだけで実践的なコーディングができないんです。

TextFieldからPopoverへのセグエ、入力した値をTextFieldに戻すためにデリゲーションが大活躍します。ここらの詳しい解説をしていませんがグーグルで調べてなんとか自分で解決しました。

そして悩んでいたのが、複数のTextFieldからどうやって1つだけ用意されているデリゲーションメソッドを利用すればいいのか分からなくなっていました。

やっぱりグーグルって素晴らしいですね。調べていると解決できました!

f:id:yataiblue:20170509181417j:plain

誕生日フィールドをタップするとDatePickerが表示されたPopoverが出現します。IDフィールドをタップするとNumberパッドのPopoverが表示されるようになりました。

分かっています。Popoverのレイアウトがむちゃくちゃです。まだStack Viewの絡んだレイアウト調整がちゃんと理解できてないんです。こういう実践的なコーディングの勉強がまだ不十分なんです。

まだまだですね(^_^;)

Swiftで遊ぼう! - 970 - いろいろ考える

私もいろいろ考えているつもりですが、これで生計を立てているプロのプログラマーの人は本当にいろいろ考えているんだなって思います。考えなきゃいけないポイントが本当に多いですよね。

自作アプリを作ろうとしていますが、コーディングを考える以前に、「入力スタイルをどうしたらいいんだろう?」という疑問が大きなウエイトを占めています。

iPadというiPhoneより少し大きな画面で入力をする場合、iPhoneと同じ入力スタイルを用意するのに違和感があります。iPhoneなら画面の下からニョロニョロとせり出してくるキーボードでも違和感がありませんが、画面の広いiPadで決して入力しやすいと思いません。そこでPopoverによる入力を考えてみたんですがどうでしょうね。

入力のすべての項目でPopoverを使うのには抵抗があります。じゃあどの入力ならいいのか?いろいろ考えながらテストしたいと思っています。

これから患者情報を登録するユーザーインターフェイスを考えていきたいと考えています。意見があれば教えてください。

では。

Swiftで遊ぼう! - 969 - 年齢も自動計算

Popoverで誕生日の日付を選択したら自動的に年齢を計算して年齢フィールドに表示するようにしました。

こういう簡単な機能でも拡張するのに時間がかかりますね。

まだまだ拡張性を考えながらコーディングができていないからです。可読性の高いコーディングをするための勉強もどうしたらいいんでしょうね。

自分で書いたコードが既に複雑になり、ブログで紹介できるレベルを超えてしまいました。あり得ないですね。

困ったものです...

f:id:yataiblue:20170502181940j:plain

上手く動いているように見えます。しかし、まだ入力の制限がかかっていません。誕生日を現時点から未来に設定できるからです。こういう制限も少し考えないと今の私にはできません(T_T)

何事もゆっくりと。

Swiftで遊ぼう! - 968 - DateFormatterを利用する

新しいAPIが公開されると、古いAPIを無視しようとする悪い癖があります。ISO8601DateFormatterクラスがiOS10から利用できるようになったという話を昨日しました。

もう古いDateFormatterは必要無いって思い込みましたが、少し調べているとISO8601DateFormatterがDateFormatterの機能をすべて内包している訳ではありません。

ということで「年月日」表示をするために「DateFormatter」を利用しました。

すると、昨日悩んでいたことがあっという間に解決!

f:id:yataiblue:20170502071204j:plain

ちょっとずつ進歩しています。