IOS10 - 在自定义 inputView 中使用 CollectionView

Posted

技术标签:

【中文标题】IOS10 - 在自定义 inputView 中使用 CollectionView【英文标题】:IOS10 - Using a CollectionView inside a custom inputView 【发布时间】:2016-10-06 07:55:00 【问题描述】:

我正在尝试使用 0 到 9 的数字输入自定义密码,并像这样随机放置一些空键:

这是我的简单 UICollectionViewCell

class KeyboardKeyCollectionViewCell: UICollectionViewCell 
    @IBOutlet var mLabel: UILabel!

我的 UIView 包含 UICollectionView(作为测试,我只尝试使用 3 个单元格)

import UIKit
protocol KeyboardDelegate: class 
    func keyWasTapped(character: String)


class PasswordKeyboard: UIView , UICollectionViewDataSource , UICollectionViewDelegate 

    @IBOutlet var mCollectionView: UICollectionView!
    weak var delegate: KeyboardDelegate?
    required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
        initializeSubviews()
    

    override init(frame: CGRect) 
        super.init(frame: frame)
        initializeSubviews()
    

    func initializeSubviews() 
        let lBundle = Bundle(for: type(of: self))
        let lKeyboardNib = UINib(nibName: "PasswordKeyboard", bundle: lBundle)
        let lCellNib = UINib(nibName: "KeyboardKeyCollectionViewCell", bundle: lBundle)
        let lKeyboardNibView = lKeyboardNib.instantiate(withOwner: self, options: nil).first as! UIView
        self.addSubview(lKeyboardNibView)
        lKeyboardNibView.frame = self.bounds

        mCollectionView.dataSource = self
        mCollectionView.delegate = self

        mCollectionView.register(lCellNib, forCellWithReuseIdentifier: "idgaf")
    

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
   
        return 3
   

   func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "idgaf", for: indexPath as IndexPath) as! KeyboardKeyCollectionViewCell
        cell.mLabel.text = String(describing: indexPath.item) //TODO Randomize this
        return cell
   

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
    
         let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "idgaf", for: indexPath as IndexPath) as! KeyboardKeyCollectionViewCell
        self.delegate?.keyWasTapped(character: cell.mLabel.text!)

    

以及带有将使用该自定义键盘的文本字段的 ViewController

class LoginController: UiViewController  , KeyboardDelegate

    func keyWasTapped(character: String) 
        passwordField.insertText(character)
    

    override func viewDidLoad()
    
        super.viewDidLoad()
        let keyboardView = PasswordKeyboard(frame: CGRect(x: 0, y: 0, width: 0, height: 300))
        keyboardView.delegate = self 
        passwordField.inputView = keyboardView

    

我目前所做的并没有使我的应用程序崩溃,视图按原样显示,并且委托被调用是它应该但是我丢失了我单击的单元格的引用。

在创建单元格的过程中,我从调试器中获得了一些日志:

点击第一个单元格后:

我一直在尝试解决此问题,但找不到导致此问题的原因。感谢您阅读直到此。

【问题讨论】:

【参考方案1】:

而不是在您的选择委托方法中使单元格出队,尝试这种方式来获取单元格。

func cellForItem(at indexPath: IndexPath) -> UICollectionViewCell?



func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)

     let cell = cellForItem(indexPath) as! KeyboardKeyCollectionViewCell
    self.delegate?.keyWasTapped(character: cell.mLabel.text!)


希望对你有帮助

【讨论】:

更多信息developer.apple.com/reference/uikit/uicollectionview/…

以上是关于IOS10 - 在自定义 inputView 中使用 CollectionView的主要内容,如果未能解决你的问题,请参考以下文章

ios添加自定义inputView

iOS:自定义 UITextField 的 inputView 大小

iOS 8中具有动态高度的自定义inputView

UISearchBar 的自定义 InputView 在 iOS7 中不起作用

如何设置自定义 inputView 的高度?

如何在 iOS 10 中使导航栏透明