iosswiftuicollectionviewinputaccessoryview

How to add UICollectionView to the inputAccessoryView


I want to add UICollectionView to the inputAccessoryView so that I can scroll the list.

override var inputAccessoryView: UIView? {
    let customView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: 80))
    customView.backgroundColor = UIColor.red
    return customView
}

Solution

  • To add a UICollectionView as inputAccessoryView,

    1. Create a custom UIView containing a UICollectionView first and add the UICollectionViewDataSource methods to it.

    class CustomView: UIView, UICollectionViewDataSource {
        @IBOutlet weak var collectionView: UICollectionView!
    
        let words = ["abscind","downwind","headwind","lind","rescind","sind","skinned","tailwind","thin-skinned","tinned","twinned","upwind","whirlwind","wind"]
    
        override func awakeFromNib() {
            super.awakeFromNib()
            self.collectionView.register(UINib(nibName: "CustomCell", bundle: nil), forCellWithReuseIdentifier: "cell")
        }
    
        func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
            return self.words.count
        }
    
        func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CustomCell
            cell.label.text = self.words[indexPath.row]
            return cell
        }
    }
    
    class CustomCell: UICollectionViewCell {
        @IBOutlet weak var label: UILabel!
    }
    

    2. Add the instance of above created CustomView as the inputAccessoryView of UITextField/UITextView as per your requirement.

    class ViewController: UIViewController {
        @IBOutlet weak var textField: UITextField!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            if let customView = Bundle.main.loadNibNamed("CustomView", owner: self, options: nil)?.first as? CustomView {
                self.textField.inputAccessoryView = customView
            }
        }
    }
    

    In the above code, you can configure the collectionView with data as required.

    enter image description here