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

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

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

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

Swift

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

Q&A

0回答

1435閲覧

【Swift】UIDatePickerをUITextFieldにinputViewするとレイアウトがクラッシュする

beginner_Jiro

総合スコア10

Xcode

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

Swift

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

0グッド

0クリップ

投稿2021/09/16 10:30

編集2021/09/27 07:31

お世話になっております。
表題の件について質問させてください。

疑問点

UIDatePickerをインスタンス化した後にUITextField.inputView = UIDatePicker
を行いテキストフィールドをタップした時点で発火するようにコードを記述したところレイアウトに関するエラーが出てしまいます。

下記コードになります。(UIViewの処理のみを記載いたします。)

Swift

1import Foundation 2import UIKit 3 4 5class DatapickerView:UIView{ 6 7 override init(frame: CGRect) { 8 super.init(frame: frame) 9 10 autoLayoutSetUp() 11 datapickerSetup() 12 } 13 14 required init?(coder: NSCoder) { 15 fatalError("init(coder:) has not been implemented") 16 } 17 18 //生年月日ピッカーと付随するテキストフィールド及び決定バー 19 var datapicker:UIDatePicker = UIDatePicker() 20 var dateOfBirthTextField:UITextField = { 21 let returnTextField = UITextField() 22 returnTextField.borderStyle = .roundedRect 23 returnTextField.placeholder = "生年月日" 24 return returnTextField 25 }() 26 var toolbar:UIToolbar = UIToolbar() 27 let spacelItem = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil) 28 let doneItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(done)) 29 30 // 決定ボタン押下 31 @objc func done() { 32 dateOfBirthTextField.endEditing(true) 33 34 // 日付のフォーマット 35 let formatter = DateFormatter() 36 formatter.dateFormat = "yyyy-MM-dd" 37 dateOfBirthTextField.text = "(formatter.string(from: Date()))" 38 } 39 40 func autoLayoutSetUp() { 41 //各オブジェクトをViewに追加 42 addSubview(dateOfBirthTextField) 43 44 //UIオートレイアウトと競合させない処理 45 dateOfBirthTextField.translatesAutoresizingMaskIntoConstraints = false 46 47 dateOfBirthTextField.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true 48 dateOfBirthTextField.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true 49 dateOfBirthTextField.topAnchor.constraint(equalTo: self.topAnchor).isActive = true 50 dateOfBirthTextField.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: -UIScreen.main.bounds.height/1.4).isActive = true 51 52 } 53 54 func datapickerSetup() { 55 // ピッカー設定 56 datapicker.datePickerMode = UIDatePicker.Mode.dateAndTime 57 datapicker.timeZone = NSTimeZone.local 58 datapicker.locale = Locale.current 59 datapicker.preferredDatePickerStyle = .wheels 60 61 //ピッカーのツールバーのレイアウト設定 62 toolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: self.frame.size.width, height: 35)) 63 //ツールバーに各セット 64 toolbar.setItems([spacelItem, doneItem], animated: true) 65 66 // インプットビュー設定 67 dateOfBirthTextField.inputView = datapicker 68 dateOfBirthTextField.inputAccessoryView = toolbar 69 70 } 71 72}

エラー文

2021-09-16 19:20:54.276642+0900 Practice[24575:2112912] [LayoutConstraints] Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) ( "<NSAutoresizingMaskLayoutConstraint:0x60000151ba20 h=--& v=--& _UIToolbarContentView:0x7f92036068f0.width == 0 (active)>", "<NSLayoutConstraint:0x60000156c500 H:|-(0)-[_UIButtonBarStackView:0x7f920362af70] (active, names: '|':_UIToolbarContentView:0x7f92036068f0 )>", "<NSLayoutConstraint:0x60000156c550 H:[_UIButtonBarStackView:0x7f920362af70]-(0)-| (active, names: '|':_UIToolbarContentView:0x7f92036068f0 )>", "<NSLayoutConstraint:0x60000151ae40 'TB_Leading_Leading' H:|-(16)-[_UIModernBarButton:0x7f9203678370'Done'] (active, names: '|':_UIButtonBarButton:0x7f92036779a0 )>", "<NSLayoutConstraint:0x60000151ae90 'TB_Trailing_Trailing' H:[_UIModernBarButton:0x7f9203678370'Done']-(16)-| (active, names: '|':_UIButtonBarButton:0x7f92036779a0 )>", "<NSLayoutConstraint:0x60000151b520 'UISV-canvas-connection' UILayoutGuide:0x600000f5dc00'UIViewLayoutMarginsGuide'.leading == UIView:0x7f9203677830.leading (active)>", "<NSLayoutConstraint:0x60000151b570 'UISV-canvas-connection' UILayoutGuide:0x600000f5dc00'UIViewLayoutMarginsGuide'.trailing == _UIButtonBarButton:0x7f92036779a0.trailing (active)>", "<NSLayoutConstraint:0x60000151b5c0 'UISV-spacing' H:[UIView:0x7f9203677830]-(0)-[_UIButtonBarButton:0x7f92036779a0] (active)>", "<NSLayoutConstraint:0x60000156c370 'UIView-leftMargin-guide-constraint' H:|-(0)-[UILayoutGuide:0x600000f5dc00'UIViewLayoutMarginsGuide'](LTR) (active, names: '|':_UIButtonBarStackView:0x7f920362af70 )>", "<NSLayoutConstraint:0x60000156c410 'UIView-rightMargin-guide-constraint' H:[UILayoutGuide:0x600000f5dc00'UIViewLayoutMarginsGuide']-(0)-|(LTR) (active, names: '|':_UIButtonBarStackView:0x7f920362af70 )>" ) Will attempt to recover by breaking constraint <NSLayoutConstraint:0x60000151ae90 'TB_Trailing_Trailing' H:[_UIModernBarButton:0x7f9203678370'Done']-(16)-| (active, names: '|':_UIButtonBarButton:0x7f92036779a0 )> Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.

変数名や関数の位置など急いで再現したので、かなり汚くなっていますがご容赦ください。

### 結論と質問の意図
一応動きはするので問題なければこのままでもいいのですがコードレイアウトを行なっているために、エラーがどうして出ているのか気になってしまいます。

別アプローチとしてはTextField.inputviewではなく自身のViewに対してUidatapickerをaddSubviewしてレイアウトを指定しても良いのですがTextFieldとの紐付けがうまくいかずに困っております。

以上になります。ご回答いただける方いらっしゃいましたらよろしくお願いいたします。

追記;2021/09/27
こちらエラーの出るタイミングとしましては、TextField(当コードではdateOfBirthTextField)をタップして入力しようと試みた際にエラーとして出てしまいます。

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

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

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

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

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

hoshi-takanori

2021/09/17 22:59

とりあえず試した限りではエラーは出ませんね。 エラーメッセージを見ると toolbar の doneItem の制約に問題があるように見えますが…。
beginner_Jiro

2021/09/27 07:28

ご返信いただきありがとうございます。 ご指摘の通りdoneItemを確認してみましたが toolbar.setItems([spacelItem, doneItem], animated: true) としてtoolbarにアイテム配置しているのでレイアウト設定は行なっていないのにどうしてエラーが出るのか分からず。。。って感じですね。とりあえず一旦保留にしてこのまま進めていこうと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問