当重复使用单元格时,我的UITextField
和UITextView
出现问题,即当我滚动传递包含UITextField
和UITextView
的2个单元格时。< / p>
关于可重用单元格的问题,我已经看过很多问题,但与那些问题不同,我没有使用自定义UITableViewCell
,因为我有5个原型单元格,每个单元格包含不同的属性,因此创建了5个不同的自定义UITableViewCells
对我来说并不理想。
我在UITextField
内以编程方式创建UITextView
和cellForRowAt
,如下所示:
extension MainViewController: UITableViewDelegate
{
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
var cell: UITableViewCell = UITableViewCell()
if indexPath.section == 0
{
cell = tableView.dequeueReusableCell(withIdentifier: "DetailsCell", for: indexPath)
let textField: UITextField = UITextField(frame: CGRect(x: 8, y: 0, width: cell.frame.size.width, height: cell.frame.size.height) )
textField.tag = 1
if segueToThisVC == true && title.isEmpty == true
{
textField.text = "Required..."
}
else
{
textField.text = title
}
textField.delegate = self
textField.returnKeyType = UIReturnKeyType.done
textField.addTarget(self, action: #selector(MainViewController.textFieldDidChange(textField:)), for: UIControlEvents.editingChanged)
cell.addSubview(textField)
}
else if indexPath.section == 1 || indexPath.section == 2
{
let toolBar = UIToolbar()
toolBar.barStyle = UIBarStyle.default
toolBar.frame.size.height = 35
toolBar.isTranslucent = true
let doneButton = UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(MainViewController.dismissKeyboard(_:) ) )
let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
toolBar.setItems([spaceButton, doneButton], animated: false)
toolBar.isUserInteractionEnabled = true
if indexPath.section == 1
{
doneButton.tag = 1
cell = tableView.dequeueReusableCell(withIdentifier: "DetailsCell", for: indexPath)
let textView: UITextView = UITextView()
textView.tag = 2
textView.textColor = UIColor.black
textView.isScrollEnabled = false
if segueToThisVC== true && description.isEmpty == true
{
textView.text = "Optional..."
}
else
{
textView.text = description
}
textView.inputAccessoryView = toolBar
textView.delegate = self
cell.contentView.addSubview(textView)
textView.translatesAutoresizingMaskIntoConstraints = false
// Programmatically set the constraints of the text field
}
else if indexPath.section == 2
{
...
}
}
...
return cell
}
}
我的UITextFieldDelegate
和UITextViewDelegate
:
extension MainViewController: UITextFieldDelegate
{
func textFieldDidBeginEditing(_ textField: UITextField)
{
textField.text = nil
}
func textFieldDidEndEditing(_ textField: UITextField)
{
if textField.text?.isEmpty == true
{
textField.text = "Required..."
}
if textField.tag == 1
{
if let textFieldTitle = textField.text
{
if textFieldTitle == "Required..."
{
textFieldTitle = ""
}
else
{
title = textFieldTitle
}
}
}
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool
{
textField.resignFirstResponder()
return true
}
func textFieldDidChange(textField: UITextField)
{
if textField.tag == 1
{
title = textField.text!
}
}
}
extension MainViewController: UIextViewDelegate
{
func textViewDidBeginEditing(_ textView: UITextView)
{
textView.text = nil
}
func textViewDidEndEditing(_ textView: UITextView)
{
if textView.text?.isEmpty == true
{
textView.text = "Optional..."
}
}
func textViewDidChange(_ textView: UITextView)
{
if let textViewDescription = textView.text
{
description = textViewDescription
}
tableView.beginUpdates()
tableView.endUpdates()
}
}
最初加载MainViewController
时,UITextField
的文字设置为必需,UITextView
的文字设置为可选
如果我不向上滚动到第一个单元格(带有UITextField
)和第二个单元格(带有UITextView
)变得不可见的点,选择UITextField
会导致委托给致电textFieldDidBeginEditing
并选择UITextView
会让其代表致电textViewDidBeginEditing
。这是按预期发生的。
这是键盘在滚动之前在两个单元格上的显示方式,如编码:
但是,以下是我目前面临的问题:
UITableView
向上滚动到第一个和第二个单元格后,UITextView
代表会调用textFieldDidBeginEditing
而不是textViewDidBeginEditing
,从而触发UITextField
的键盘} UITextView
不会导致可选占位符文本消失,这也是由问题1引起的,因此将文本输入到UITextView
显示以下屏幕截图:UITextView
的任何文字都会导致文本显示在UITextField
中,文字会从UITextView
中消失,而会离开显示可选的占位符文本。这种情况发生在两个细胞再次可见时。由于我没有使用自定义UITableViewCell
,因此我无法使用prepareForReuse
,因此我尝试将UITextField
和UITextView
文本设置为nil in didEndDisplaying
如图所示:
func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath)
{
print("didEndDisplaying")
// Dequeue the cell to load data
var cell: UITableViewCell = UITableViewCell()
if indexPath.section == 0 || indexPath.section == 1
{
cell = tableView.dequeueReusableCell(withIdentifier: "DetailsCell", for: indexPath)
if indexPath.section == 0
{
if let textField = cell.viewWithTag(1) as? UITextField
{
textField.text = nil
}
}
else
{
if let textView = cell.viewWithTag(2) as? UITextView
{
textView.text = nil
}
}
}
....
}
然而,这不起作用。有人可以告诉我,考虑到my code implementation
?
谢谢!