UIColletionViewCell 内的 UITextField 成为FirstResponder

Posted

技术标签:

【中文标题】UIColletionViewCell 内的 UITextField 成为FirstResponder【英文标题】:UITextField inside UIColletionViewCell becomeFirstResponder 【发布时间】:2018-12-14 16:28:49 【问题描述】:

我知道这个问题可能有很多关于 SO 的答案。但是在尝试了在互联网上找到的所有解决方案(+我的一些自定义发明..)之后,我仍然无法做到我想要实现的目标。

故事是这样的:

我有一个 UICollectionViewCell,其中嵌入了一个 UITextField 的子类。

这是我的子类:

class CustomTextField: UITextField 

    private let padding = UIEdgeInsets(top: 6.0, left: 0.0, bottom: 0.0, right: 2.0)

    private lazy var lineView: UIView = 
        let lineView = UIView()
        lineView.translatesAutoresizingMaskIntoConstraints = false
        lineView.isUserInteractionEnabled = false
        lineView.frame.size.height = 2
        lineView.backgroundColor = UIColor.tiara
        return lineView
    ()

    override func textRect(forBounds bounds: CGRect) -> CGRect 
        return bounds.inset(by: padding)
    
    override func placeholderRect(forBounds bounds: CGRect) -> CGRect 
        return bounds.inset(by: padding)
    

    override func editingRect(forBounds bounds: CGRect) -> CGRect 
        return bounds.inset(by: padding)
    

    required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
        commonInit()
    

    func toggleColors() 
        if isFirstResponder 
            lineView.backgroundColor = .black
         else 
            lineView.backgroundColor = UIColor.tiara
        
    


private extension CustomTextField 
    func commonInit() 
        addSubview(lineView)
        constraintLineView()
        textColor = UIColor.tiara
    

    func constraintLineView() 
        lineView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
        lineView.widthAnchor.constraint(equalTo: widthAnchor).isActive = true
        lineView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
        lineView.heightAnchor.constraint(equalToConstant: 2.0).isActive = true
    

这是我在 UICollectionViewCell 中使用的代码:

@discardableResult
func setFirstResponder() -> Bool 
    return customTextField.becomeFirstResponder()


func endEditing() 
    customTextField.resignFirstResponder()

customTextField.becomeFirstResponder 的结果总是false

它是从我的 UIViewController 调用的:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 
    guard indexPath.row != 0 else  return 

    dispatchService.stop()
    let topIndexPath = IndexPath(item: 0, section: 0)

    let topCell: Cell = collectionView.dequeueReusableCell(for: topIndexPath)
    topCell.endEditing()
    service.data.rearrange(from: indexPath.row, to: 0)
    update()

    collectionView.performBatchUpdates(
        collectionView.moveItem(at: indexPath, to: topIndexPath)
        collectionView.scrollToItem(at: topIndexPath, at: .top, animated: true)
    )  (_) in
        let secondCell: Cell = collectionView.dequeueReusableCell(for: topIndexPath)
        secondCell.setFirstResponder()
        self.dispatchService.reset()
    

我真的不知道从哪里开始,这是我提供的最后一个解决方案,它仍然没有显示任何键盘。

我正在使用真实设备 iPhone X ios 12.1。

【问题讨论】:

【参考方案1】:

我可能没有安静的正确答案,但我认为问题在于您将牢房放入 collectionView(didSelectItemAt:) 的方式。

您正在使用dequeueReusableCell 而不是使用cellForItem(at:) 来获取您的单元格。因此,您正在创建一个可重复使用的单元格,而没有得到您感兴趣的单元格。

【讨论】:

以上是关于UIColletionViewCell 内的 UITextField 成为FirstResponder的主要内容,如果未能解决你的问题,请参考以下文章

React - 网格内的材质 UI 项目拒绝居中

r闪亮ui中for循环内的逗号

容器内的jquery ui可拖动滚动

ng-view内的角度ui-grid 100%高度

弹出窗口内的JQuery UI Datepicker

UI Scroll View 内的视图上的触摸事件