Swiftで遊ぼう! on Hatena

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

Swiftで遊ぼう! - 967 - Popoverの微調整は続く

少しずつ自分の望む機能は実装できています。TextFieldをタップしてPopoverが表示され、日付を選択するとその日付がTextFieldに表示されるところまで実装しました。

TextFieldに日付が既に表示されていると、Popoverにその日付が表示されるようにしました。

本当に少しずつです。

f:id:yataiblue:20170501180407j:plain

Dateクラスの取り扱いは少し複雑という話は以前しました。Dateクラスで日付を扱うのですが、画面に表示するときはStringクラスを使用します。このDateクラスとStringクラスの相互のやりとりをDateFormatterクラスが請け負っているんです。

じゃあ素直にDateFormatterクラスを使用しようと思ったら...

iOS10からDateFormatterクラスが進化していたことが分かりました(^_^;)

ISO8601DateFormatter

まだまだ勉強が足りないのですが以下に簡単な説明があったので助かりました。

[iOS 10] ISO8601DateFormatter について | Developers.IO

それでも行き詰まっています。上のフィールドで表示されている「1968-11-15」を「1968年11月15日」に変更できないんです。計算型プロパティで実装しなければならないのか、標準のメソッドかプロパティに存在するのかまだ分かっていません。ご存じの方がいらっしゃれば教えて下さい。

では。

Swiftで遊ぼう! - 966 - Popoverの微調整

入力のためのユーザーインターフェースを考えることは重要だと思います。

しかしながら、細かいインターフェイスを考えながら全体を作り上げていく作成法は望ましくないでしょう。作品をなんとか作り上げたいプログラミングど素人の親父の足掻きだと思ってください。3ヶ月でアプリができるこの世の中で、3年もかかっています(^_^;)

今日は少しPopoverの微調整をしました。TextFieldをタップしてPopoverを出現させ、日付を選択するとTextFieldに日付を表示させるところまでできました。ちゃんとデリゲーションのやり方が理解できているってことです。また、セグエでPopoverが表示されるデフォルトの位置が微妙に気に入らなかったので、テキストフィールドのホリゾンタルの中央に動かしました。

f:id:yataiblue:20170501085117j:plain

まだ不十分です。ググりながら分からないところを調べながら進んでいます。

では。

Swiftで遊ぼう! - 965 - Popoverのメモ1

Popoverをコードで利用するときの備忘録

// DatePopoverControllerはViewControllerのサブクラス
let dateController = DatePopoverController()

dateController.modalPresentationStyle = .popover
dateController.preferredContentSize = 
        CGSize(width: 300, height: 300)
dateController.popoverPresentationController?.sourceView = 
        view
dateController.popoverPresentationController?.sourceRect = 
        sender.frame
dateController.popoverPresentationController?.
        permittedArrowDirections = .any

if let popoverController = dateController.
            popoverPresentationController {
    popoverController.delegate = self
    popoverController.backgroundColor = UIColor.blue
            
}
        
present(dateController, animated: true, completion: nil)

これは@IBActionに設定してコードでPopoverを作るケース。

Swiftで遊ぼう! - 964 - Popoverを極める!

自作アプリを作っています。今まで勉強した知識を基にして組み上げているって感じです。

日付を入力するインターフェイスに「Popove」を採用してみました。コードで実装とストーリーボードで実装する方法を復習してポップオーバーの利用は完璧です。

日付の入力は「DatePicker」が望ましいのかなってインターフェイスも考えています。

基本的にiPadアプリを作っているので、この方法が最適じゃないかと思います。西暦と和暦の切り替えもできるようにしました。

f:id:yataiblue:20170430105412j:plain

まあ、まだまだ調べながら実装しているって感じです。

Swiftで遊ぼう! - 963 - dateComponentsを使いこなせ!

年齢計算をする場合、Calendarクラスを使って、DateクラスからDateComponentsクラスに変換して日付計算をするのが基本のようです。Dateクラスだけで日付の計算はできないからです。Dateクラスは日付にかかわる「単位」と考えるといいでしょう。

日付を引き算させるメソッドが次のものです。

func dateComponents(_ components: Set<Calendar.Component>, 
                      from start: Date, 
                          to end: Date) -> DateComponents

ここでCalendar.Componentでどの情報を扱うか指定します。そして2つのDate型の差を得るメソッドになります。これでComponentの「.year」だけ扱えば年齢が得られます。

じゃあどうすべきか?指定された日付(誕生日)のDateクラスインスタンス作成をするためにDateクラスのイニシャライザーは対応していません。Dateクラスインスタンスを作るためにCalendarクラスかDateFormatterを使う必要があります。日付の計算をさせるのでCalendarクラスを利用するのが望ましいということですね。

// まずカレンダークラスインスタンスを作ります。

let myCalendar = Calendar(identifier: .gregorian)

// Dateクラスをインスタンス化するためにDateComponentsクラスが必要
// なので必要な情報を用意します。

let myBirthdayComponents = DateComponents(calendar: myCalendar, 
                                          timeZone: nil, 
                                               era: nil, 
                                              year: 1965, 
                                             month: 4, 
                                               day: 1, 
                                              hour: nil, 
                                            minute: nil, 
                                            second: nil, 
                                        nanosecond: nil, 
                                           weekday: nil, 
                                    weekdayOrdinal: nil, 
                                           quarter: nil, 
                                       weekOfMonth: nil, 
                                        weekOfYear: nil, 
                                 yearForWeekOfYear: nil)

// 上記のDateComponentsクラスインスタンスを使ってDateクラスの
// インスタンスを作ります。

let myBirthday = myCalendar.date(from: myBirthdayComponents)

// Date型イニシャライザーを使って現在時刻を使ってDateクラスの
// インスタンを作れます。

let currentDate = Date()

// そして2つのDateクラスインスタンスの差を次のように得ます。

let myAge = myCalendar.dateComponents([.year], 
                                from: myBirthday!, 
                                  to: currentDate).year!

// myAgeはInt型なので「My age is 51.」と表示されます。

print("My age is \(myAge).")

Swiftで遊ぼう! - 962 - 日付の扱い

チュートリアルから離れ、自作アプリに取りかかっています。

しかしながらオリジナルアプリに取りかかると、あっという間に問題にぶつかりました。

ちょっと患者データを管理しようと考え、誕生日や年齢を扱おうとするとチュートリアル本には説明がありません(^^;)

iOSAPIを勉強しなきゃいけないんですね。なんとなく日付を扱うなら「Date」を使えばいいんだって当たりはつけられましたが、ググってみても納得できる日本語の説明ページはありませんでした(T_T)

英語の記事を探すと、ありました!

たぶん、以下のリンクが今のところ最も分かりやすいい内容だと思います。

  1. How to work with dates and times in Swift 3, part 1: Dates, Calendars, and DateComponents — Global Nerdy - Joey deVilla's mobile/tech blog
  2. How to work with dates and times in Swift 3, part 2: DateFormatter — Global Nerdy - Joey deVilla's mobile/tech blog
  3. How to work with dates and times in Swift 3, part 3: Date arithmetic — Global Nerdy - Joey deVilla's mobile/tech blog
  4. How to work with dates and times in Swift 3, part 4: Adding Swift syntactic magic — Global Nerdy - Joey deVilla's mobile/tech blog

Dateクラスの扱いで混乱していたんですが、上記の内容を読んで理解できました。色々なクラスが相互に絡み合っています。

f:id:yataiblue:20170424135101j:plain

DateFormatterクラスからDateクラスインスタンスを生成でき、Calendarクラスからも生成できるため初心者に解りにくいんだと思います。それぞれの関係性が分かれば理解できますね。

上記の記事はお勧めです。

Swiftで遊ぼう! - 961 - このブログのメインを改訂

私のブログは混沌としています。3年近く勉強を続けているけど未だにアプリはできていません。親父の頭は新しいことを覚えるのが苦手なんです。でも続けています。馬鹿だからこそ続けることに意義があると信じています。

久しぶりにメインページの改訂をしました。

yataiblue.hatenablog.com