XIB/NIB 中的 UITextField 不显示复制、粘贴等上下文菜单

UITextField inside XIB / NIB does not show Copy, Paste, etc. context menu

我想在 UICollectionView 中使用 UITextFields,但我遇到了文本字段不显示上下文菜单的问题。通常在集合视图之外,当用户单击/触摸文本字段内部时,文本字段会显示上下文菜单。在集合视图中,行为丢失了。

这是我在一个简单示例中的代码。 ViewController.swift:

import UIKit

class ViewController: UIViewController {

    @IBOutlet var cv: UICollectionView!

    let string_array : [String] = [
        "test",
        "test2",
        "test3"
    ]

    var sizingTextFieldCell : TextFieldCell?
    var textfieldCellNib : UINib = UINib(nibName: "TextFieldCell", bundle: nil)

    override func viewDidLoad() {
        super.viewDidLoad()

        self.sizingTextFieldCell = (textfieldCellNib.instantiate(withOwner: nil, options: nil) as NSArray).firstObject as! TextFieldCell?

        self.cv.register(self.textfieldCellNib, forCellWithReuseIdentifier: "TextFieldCell")

        self.cv.delegate = self
        self.cv.dataSource = self
    }
}

// UICollectionView DataSource
extension ViewController : UICollectionViewDataSource
{
    // count of columns
    func numberOfSections(in collectionView: UICollectionView) -> Int
    {
        return 1
    }

    // count of cell items
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
    {
        return string_array.count
    }

    // content of the cell items
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
    {
        let form_element_index = indexPath.row    // index of the collectionView cell

        let cell : TextFieldCell = collectionView.dequeueReusableCell(withReuseIdentifier: "TextFieldCell", for: indexPath) as! TextFieldCell

        cell.textfield.text = string_array[form_element_index]

        return cell
    }
}

// UICollectionView DelegateFlowLayout
extension ViewController : UICollectionViewDelegateFlowLayout
{
    // wenn ich die funktion entferne haben alle elemente nur noch die minimalgröße
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

        let form_element_index = indexPath.row    // index of the collectionView cell

        self.sizingTextFieldCell!.textfield.text = string_array[form_element_index]

        return self.sizingTextFieldCell!.systemLayoutSizeFitting(UILayoutFittingCompressedSize)
    }
}

TextFieldCell.swift:

import UIKit

class TextFieldCell: UICollectionViewCell, UITextFieldDelegate {

    @IBOutlet var textfield: UITextField!

    override func awakeFromNib()
    {
        self.textfield.textColor = UIColor(red: 0.1, green: 0.1, blue: 0.1, alpha: 1)           // black text color
        self.layer.cornerRadius = 5                                                                 // radius 4

        textfield.delegate = self as! UITextFieldDelegate
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        //super.touchesBegan(touches, with: event)
        self.textfield.becomeFirstResponder()
        //self.next?.touchesBegan(touches, with: event)
    }

    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool
    {
        return true
    }
}

有没有人知道可以做些什么来解决这个问题? 提前致谢!

更新:

我下载了@cylov提供的工程:

https://drive.google.com/file/d/0B1w1Ti0xMEZXaFo4RGJHUDAtTFU/view

我意识到他提供的 TextField.xib 文件中的根视图是一个 UIView 而它应该是 UICollectionView。这肯定是因为在添加TexField.xib后单独添加xib文件导致的。使 UIView 表现得像 UICollectionViewCell 可能会产生意想不到的行为。

第一种方法

当你添加一个新文件(子类化 UICollectionViewCell)时,标记复选框说:Also create xib

第二种方法

解决方案的另一种方法是删除 xib 文件中存在的根视图并拖放一个全新的 UICollectionViewCell 并重新开始。 这绝对解决了这个问题。

答案无效

  1. 我尝试按照您的代码进行操作,发现未调用 UICollectionView 的以下数据源方法:

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
    

通过替换

解决了这个问题
return self.sizingTextFieldCell!.systemLayoutSizeFitting(UILayoutFittingCompressedSize)

return CGSize(width: 251.0, height: 50.0)
  1. 后来我尝试长按集合视图上的文本字段,我能够获得上下文菜单。

我附上与此相关的屏幕截图。