お世話になっております。
表題の件について質問させてください。
疑問点
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)をタップして入力しようと試みた際にエラーとして出てしまいます。
あなたの回答
tips
プレビュー