質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

キャスト

キャストとは、オブジェクトの型の変換が許可された場合に、明白に別の型への変換を行うプロセスのことです。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

1446閲覧

DatePickerでDate型をString型にキャストした時にnilが出てしまう

rainyeveryday

総合スコア22

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

キャスト

キャストとは、オブジェクトの型の変換が許可された場合に、明白に別の型への変換を行うプロセスのことです。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/04/27 11:57

編集2020/04/27 12:59

次のカスタムクラスを書き、実行しましたが、nilが見つかりました。formatterのところでNULLとなっていますが、この場合どの様に対処すれば良いのでしょうか?
setText関数でtextに代入してます。setToday関数では、DatePickerを今日の日付に合わせようとしています。

swift

1 2import Foundation 3import UIKit 4 5class DatePickerText: UITextField { 6 7 var datePicker: UIDatePicker! 8 9 override init(frame: CGRect) { 10 super.init(frame: frame) 11 commominit() 12 } 13 14 required init?(coder aDecoder: NSCoder) { 15 super.init(coder: aDecoder) 16 commominit() 17 } 18 19 func commominit(){ 20 let datePicker = UIDatePicker() 21 datePicker.date = Date() 22 datePicker.datePickerMode = .date 23 print("これは誕生日です") 24 datePicker.locale = Locale(identifier: "ja") 25 datePicker.addTarget(self, action: #selector(setText), for: .valueChanged) 26 27 28 inputView = datePicker 29 inputAccessoryView = customPicker() 30 } 31 32 @objc func setText(){ 33 let f = DateFormatter() 34 f.dateStyle = .long 35 f.locale = Locale(identifier: "ja") 36 text = "(f.string(from: datePicker.date))" 37 38 } 39 40 41 private func customPicker() -> UIToolbar { 42 let toolbar = UIToolbar() 43 toolbar.frame = CGRect(x: 0, y: 0, width: self.frame.size.width, height: 35) 44 let space = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: self, action: nil) 45 space.width = 20 46 let flexSpaceItem = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil) 47 let todayButtonItem = UIBarButtonItem(title: "リセット", style: .done, target: self, action: #selector(setToday)) 48 let defineButtonItem = UIBarButtonItem(title: "決定", style: .done, target: self, action: #selector(defineDate)) 49 50 let toolBarItem = [space, flexSpaceItem, todayButtonItem, defineButtonItem] 51 toolbar.setItems(toolBarItem, animated: true) 52 53 return toolbar 54 } 55 56 @objc private func setToday(_ sender: UIBarButtonItem){ 57 datePicker.date = Date() 58 setText() 59 } 60 61 @objc private func defineDate(_ sender: UIBarButtonItem){ 62 resignFirstResponder() 63 } 64 65 override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool { 66 return false 67 } 68 69 override func selectionRects(for range: UITextRange) -> [UITextSelectionRect] { 70 return [] 71 } 72 73 override func caretRect(for position: UITextPosition) -> CGRect { 74 return CGRect(x: 0, y: 0, width: 0, height: 0) 75 } 76 77 78} 79

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Swift

1func commominit(){ 2 let datePicker = UIDatePicker() 3 datePicker.date = Date()

2行目のletが混乱の原因ではないでしょうか。

letが原因でこの変数のスコープが関数内に限定された結果、この関数外部でdatePickerが呼ばれてもnilになってしまいます。

ちなみに、1行目のletを削除すると一応DatePickerは表示されるようです(動作までは確認していませんが)。

投稿2020/04/27 13:06

編集2020/04/27 13:08
TsukubaDepot

総合スコア5086

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rainyeveryday

2020/04/27 13:16

いつもありがとうございます。datePickerをグローバル変数にして宣言したところ、表示されました。精進します。
TsukubaDepot

2020/04/27 13:25

というか、もともと DatePickerTextのプロパティとして宣言されているようです(先頭から6行目)。
guest

0

初期値を設定したいってこと?

swift

1@objc func setText(){ 2 let f = DateFormatter() 3 f.dateStyle = .long 4 f.locale = Locale(identifier: "ja") 5 text = "(f.string(from: Date()))" 6}

その下の方にもsetToday(_:)って言うのがあるけど…

投稿2020/04/27 12:28

編集2020/04/27 12:31
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rainyeveryday

2020/04/27 13:07 編集

回答ありがとうございます。そのつもりはありません。setText関数では、textにDatePickerで合わせた日付、もしくは、BarButtonItemが押された時の条件分岐させて(setTodayなら、現在の日付、defineDateならDatePickerで合わせた日付)をtextに代入しようとしています。
rainyeveryday

2020/04/27 13:17

解決できました、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問