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 并重新开始。
这绝对解决了这个问题。
答案无效
我尝试按照您的代码进行操作,发现未调用 UICollectionView 的以下数据源方法:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
通过替换
解决了这个问题
return self.sizingTextFieldCell!.systemLayoutSizeFitting(UILayoutFittingCompressedSize)
和
return CGSize(width: 251.0, height: 50.0)
- 后来我尝试长按集合视图上的文本字段,我能够获得上下文菜单。
我附上与此相关的屏幕截图。
我想在 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 并重新开始。 这绝对解决了这个问题。
答案无效
我尝试按照您的代码进行操作,发现未调用 UICollectionView 的以下数据源方法:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
通过替换
解决了这个问题return self.sizingTextFieldCell!.systemLayoutSizeFitting(UILayoutFittingCompressedSize)
和
return CGSize(width: 251.0, height: 50.0)
- 后来我尝试长按集合视图上的文本字段,我能够获得上下文菜单。
我附上与此相关的屏幕截图。