当重复使用单元格时,非自定义UITableViewCell会导致textfield和textview发生变化吗?

时间:2017-07-22 01:22:49

标签: ios swift uitableview

当重复使用单元格时,我的UITextFieldUITextView出现问题,即当我滚动传递包含UITextFieldUITextView的2个单元格时。< / p>

关于可重用单元格的问题,我已经看过很多问题,但与那些问题不同,我没有使用自定义UITableViewCell,因为我有5个原型单元格,每个单元格包含不同的属性,因此创建了5个不同的自定义UITableViewCells对我来说并不理想。

我在UITextField内以编程方式创建UITextViewcellForRowAt,如下所示:

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
    }
}

我的UITextFieldDelegateUITextViewDelegate

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。这是按预期发生的。

这是键盘在滚动之前在两个单元格上的显示方式,如编码:

enter image description here enter image description here

但是,以下是我目前面临的问题:

  1. UITableView向上滚动到第一个和第二个单元格后,UITextView代表会调用textFieldDidBeginEditing而不是textViewDidBeginEditing,从而触发UITextField的键盘}
  2. 当再次重复使用第一个和第二个单元格时,选择UITextView不会导致可选占位符文本消失,这也是由问题1引起的,因此将文本输入到UITextView显示以下屏幕截图:
  3. enter image description here

    1. 向前滚动前两个单元格后输入UITextView的任何文字都会导致文本显示在UITextField中,文字会从UITextView中消失,而会离开显示可选的占位符文本。这种情况发生在两个细胞再次可见时。
    2. 由于我没有使用自定义UITableViewCell,因此我无法使用prepareForReuse,因此我尝试将UITextFieldUITextView文本设置为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

      ,重用细胞的正确方法是正确的

      谢谢!

0 个答案:

没有答案