

困っているのはキー入力に関するモジュールの呼ばれ方の順番です。  
TextViewの入力では、

(1)@objc showKeyboard  
(2)textViewdidbeginEditing

の順番で呼ばれます。

(2)で入力エリアを確認し、数字キーボードやメールキーボードを指定したいのですが、先にshowKeyboardが呼ばれてしまうので正しく動作できません。  
textViewはカスタムセルに設定されているので以下のようなモジュールになっています。  
何か、呼ばれる順番を変える手段はないのでしょうか？  
因みにtextFieldを使った場合は上記の逆だったと記憶しています。

[code]

    import UIKit
    
    protocol Cell_MultiLineDelegate {
        func textViewDidEndEditing(textCell: Cell_MultiLine, value: NSString) -> ()
        func textViewDidBeginEditing(textCell: Cell_MultiLine, value: NSString) -> ()
    }
    
    class Cell_MultiLine: UICollectionViewCell, UITextViewDelegate {
    
        @IBOutlet weak var leading: NSLayoutConstraint!
        @IBOutlet weak var trailing: NSLayoutConstraint!
        @IBOutlet weak var top: NSLayoutConstraint!
        @IBOutlet weak var bottom: NSLayoutConstraint!
        @IBOutlet weak var backView: UIView!
        @IBOutlet weak var foreView: UIView!
        @IBOutlet weak var contents: UITextView!
        //    @IBOutlet weak var contents: UITextField!
        
        var currentIndexPath: IndexPath!
        var delegate: Cell_MultiLineDelegate! = nil
        var currentComment: String!
        var fixedComment: String!
    
        override func awakeFromNib() {
            super.awakeFromNib()
            // Initialization code
            self.contents.delegate = self        
        }
        
        func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
            if currentIndexPath.row > 6 { // 一番下の複数行入力エリア以外　＝　特記事項エリア
                if text == "\n" {
                    textView.resignFirstResponder()
                    self.delegate.textViewDidEndEditing(textCell: self, value: contents.text! as NSString)
                    return false
                }
            }
            return true
        }
    
    /*
        internal func textFieldShouldReturn(_ textField: UITextField) -> Bool {
            textField.resignFirstResponder()
            return true
        }
    */
        internal func textViewDidEndEditing(_ textView: UITextView) {
            self.delegate.textViewDidEndEditing(textCell: self, value: contents.text! as NSString)
        }
    
        internal func textViewDidBeginEditing(_ textView: UITextView) {
            self.delegate.textViewDidBeginEditing(textCell: self, value: contents.text! as NSString)
        }
    
    }
    //　垂直方向の中央設定
    extension UITextView {
        func centerVerticalText() {
            self.textAlignment = .left
            let fitSize = CGSize(width: bounds.width, height: CGFloat.greatestFiniteMagnitude)
            let size = sizeThatFits(fitSize)
            let calculate = (bounds.size.height - size.height * zoomScale) / 2
            let offset = max(1, calculate)
            contentOffset.y = -offset
        }
    }
    
[/code]


CC BY-SA 4.0
2022-01-09T10:02:47.243
85583
2022-01-09T22:26:28.273
2022-01-09T10:11:22.853
3060
47542
question
swift xcode swift5 delegate
Swift5 TextViewのキーボード表示と入力開始delegateの順番について


`UITextViewDelegate`の`textView`
**Did**`BeginEditing`は、見るからにキーボードが表示された後に実行されそうですね。では、`textViewShouldBeginEditing`を使ってみてはいかがでしょうか？

[code]

    func textViewShouldBeginEditing(_ textView: UITextView) -> Bool {
        textView.keyboardType = .decimalPad
        return true
    }
    
[/code]

こちらで確認したところ、このDelegateで、テンキーのキーボードを表示することができました。  
おそらく、そのような単純なことでお悩みになっているのではないとは思いますが、参考まで。


CC BY-SA 4.0
2022-01-09T11:45:51.357
85586
2022-01-09T22:26:28.273
2022-01-09T22:26:28.273
18540
18540
85583
answer