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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

2回答

1049閲覧

TextFieldをタップした時にDatePickerを表示するカスタムクラスを実行できないです。

rainyeveryday

総合スコア22

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2020/04/24 05:33

初心者です。見様見真似で自分の作りたいアプリを作成しています。
UIViewController表示されているTextFieldをタップした時にDatePickerを表示するカスタムクラス(PickerText)を作ったのですが、実行するViewController(ViewController)でそのカスタムクラスを実装する方法が分からないです。
クラスのインスタンスを生成することで、そのクラスのプロパティーやメソッドを使用することができ、また、クラスのイニシャライザは、そのクラスがインスタンス化した時に処理されると認知しております。以下がそのコードになりますが、ViewControllerでDatePickerを表示する様にするには、どの様に書けば良いのでしょうか。イニシャライザを書いてるので、インスタンス化した時点で画面に表示されると思っていましたが、表示されませんでした。長くなりましたが、ご教示お願いします。

PickerTextです。

Swift

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

ViewControllerです。

Swift

1import UIKit 2 3class ViewController: UIViewController { 4 @IBOutlet weak var textField: UITextField! 5 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 9 } 10 11 @IBAction func textTap(_ sender: Any) { 12 let tapText = PickerText() 13 //ここからどの様に書けば良いのか分かりません 14 } 15 16} 17

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

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

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

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

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

guest

回答2

0

ベストアンサー

https://tech-tokyobay.manju.tokyo/archives/163
↑の
Interface Builderから使う
って場所を見て。

投稿2020/04/24 06:18

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

rainyeveryday

2020/04/24 10:59 編集

ありがとうございます、表示できました。しかし、カスタムクラスのイニシャライザ内でinputViewを定義しているので、ViewControllerでクラスをインスタンス化した時に表示は行われると思ったのですが、表示できないのは肝心のtextFieldがカスタムクラスを継承していなかったからでしょうか?
guest

0

textTapのsenderが、該当のPickerTextになるので、そこでキャストしてあげて、処理を書くといいと思います。

Swift

1import UIKit 2 3class ViewController: UIViewController { 4 @IBOutlet weak var textField: UITextField! 5 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 9 } 10 11 @IBAction func textTap(_ sender: Any) { 12 let tapText = sender as PickerText 13 //ここから処理を書くといいと思います 14 } 15 16}

投稿2020/04/24 06:11

freemann

総合スコア264

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

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

rainyeveryday

2020/04/24 10:40

回答ありがとうございます。処理というのは、例えばどの様な処理でしょうか? textFieldが押された時に、カスタムクラスに書いたものを実行してDatePickerを表示させたいのですが... カスタムクラスのイニシャライザの中でinputViewにUIDatePicker()を代入しているので、ViewControllerでPickerTextクラスがインスタンス化した時に画面に表示されるのではないですか?(表示されませんでしたが...)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問