【问题标题】:UITextField doesn't end editing in a UITableViewCell in Swift 4UITextField 不会在 Swift 4 的 UITableViewCell 中结束编辑
【发布时间】:2018-06-01 10:00:42
【问题描述】:

我还是 swift 新手,我想请教您。提前谢谢你,对不起我的英语不好。

我的目标是:

用户点击表格行中的编辑按钮。 UITextField 出现在单元格中。输入数值后按ReturnUITextField再次消失,重新计算单元格。

editButton 按下 -> 隐藏 priceCell & 显示 UITextField & 显示键盘 & 开始编辑/输入值(闪烁光标)-> 停止编辑/输入值按 Return 键执行 -> 隐藏 @987654331 @ & 显示 priceCell & 将输入的值保存到数组中并重新加载已编辑的行

我使用this 答案作为起始蓝图。

我还想使用.decimalPad 键盘来更轻松地输入数值并限制用户只能使用数字(和小数点),但这不包括使用Return 键作为停止编辑,对吗?

我找到了this 可能的解决方案,但我的问题似乎很复杂......

我的视图控制器:

import UIKit

class PortfolioViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate, PortfolioCellDelegate {    

    let getData = GetData()

    ...

    override func viewDidLoad() {
        super.viewDidLoad()

        cellTableView.delegate = self
        cellTableView.dataSource = self

        cellTableView.register(UINib(nibName: "PortfolioCell", bundle: nil), forCellReuseIdentifier: "portfolioCell")

        self.currencyControl.selectedSegmentIndex = MyVariables.currencyControlSelected

    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let coinCell = tableView.dequeueReusableCell(withIdentifier: "portfolioCell", for: indexPath) as! PortfolioCell

        ...

        coinCell.delegate = self

        return coinCell
    }

    ...


    func portfolioButtonPressed(coinCell: PortfolioCell) {
        let indexPath = self.cellTableView.indexPathForRow(at: coinCell.center)!
        let selectedCell = cellTableView.cellForRow(at: indexPath) as! PortfolioCell

        selectedCell.priceCell.isHidden = true
        selectedCell.textCell.isHidden = false

        selectedCell.textCell.delegate = self

        func textFieldDidEndEditing(textField: UITextField) {
            let owned: Double = Double(textField.text!)!

            if owned >= 0 {
                MyVariables.dataArray[indexPath.row].ownedCell = owned
            } else {
                MyVariables.dataArray[indexPath.row].ownedCell = 0.00
            }

            selectedCell.priceCell.isHidden = false
            selectedCell.textCell.isHidden = true

            self.cellTableView.reloadData()
        }

        func textFieldShouldReturn(textField: UITextField) -> Bool {
            selectedCell.textCell.resignFirstResponder()
            return true
        }
    }
    ...
}

我的自定义单元格:

import UIKit

protocol PortfolioCellDelegate {
    func portfolioButtonPressed(coinCell: PortfolioCell)
}

class PortfolioCell: UITableViewCell {

    var delegate: PortfolioCellDelegate?

    ...

    @IBAction func editCellPressed(_ sender: UIButton) {
     delegate?.portfolioButtonPressed(coinCell: self)
    }
    ...
}

现在当按钮被正确按下时UITextField 显示,但在按下Return 键后不要关闭。

或者我应该完全改变它并使用点击手势?

【问题讨论】:

  • 问题是我没有声明UITextField委托,我不知道我可以使用override func awakeFromNib() {...}override func viewDidLoad() {}一样声明委托

标签: ios swift uitableview uibutton uitextfield


【解决方案1】:

要在任何类型的滚动视图中结束编辑,只需使用此

cellTableView.keyboardDismissMode = .onDrag

cellTableView.keyboardDismissMode = .interactive

当你与 tableView 交互时它会隐藏键盘

【讨论】:

    【解决方案2】:

    对于数字键盘,您可以将工具栏添加为文本字段的 inputAccessoryView。在工具栏上添加取消按钮以关闭键盘。

    【讨论】:

      【解决方案3】:

      有两种方法:

      1.) 代表 2.) IQKeyboardManager

      1.) 使用 UITextFieldDelegate

      有一个名为“textFieldShouldEndEditing”的特定回调 在这个方法中,返回true。

      2.) 使用 IQKeyboardManager 一列库。这个库自动管理所有的文本字段和滚动视图。您在 AppDelegate 中使用一行即可激活它,因此它易于使用。

      https://github.com/hackiftekhar/IQKeyboardManager

      【讨论】:

      • 我试过 IQKeyboardManagerSwift。我按照安装指南进行操作,但工具栏没有显示。但我肯定会尝试在未来再次使用它......
      【解决方案4】:

      工作但没有想要的那么时尚,而且我无法让IQKeyboardManager 工作,所以我确实使用了inputAccessoryView

      自定义单元格:

      import UIKit
      
      protocol PortfolioCellDelegate {
          func portfolioButtonPressed(didSelect coinCell: PortfolioCell)
          func portfolioButtonPressed(coinCell:PortfolioCell, editingChangedInTextCell newValue:String)
      }
      
      class PortfolioCell: UITableViewCell, UITextFieldDelegate  {
      
          var delegate: PortfolioCellDelegate?
      
          ...
      
          @IBAction func editCellPressed(_ sender: UIButton) {
              textCell.becomeFirstResponder()
              delegate?.portfolioButtonPressed(didSelect: self)
          }
      
          @IBAction func textCellValueChanged(_ sender: UITextField) {
      
              if (sender.text?.isEmpty)! {
                  delegate?.portfolioButtonPressed(coinCell: self, editingChangedInTextCell: "XXX")
              } else {
                  let text = sender.text
                  delegate?.portfolioButtonPressed(coinCell: self, editingChangedInTextCell: text!)
              }
          }
      
          override func awakeFromNib() {
              super.awakeFromNib()
      
              self.textCell.delegate = self
      
              let flexiableSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
              let doneButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.done, target: self, action: #selector(self.doneButtonAction))
              let toolBar:UIToolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: frame.size.width, height: 35))
      
              toolBar.barTintColor = UIColor(red:0.15, green:0.69, blue:0.75, alpha:1.0)
              toolBar.tintColor = UIColor(red:0.93, green:0.93, blue:0.93, alpha:1.0)
              toolBar.setItems([flexiableSpace, doneButton], animated: false)
      
              textCell.inputAccessoryView = toolBar
              textCell.keyboardType = UIKeyboardType.decimalPad
          }
      
          @objc func doneButtonAction() {
              textCell.endEditing(true)
          }
      
          ...       
      }
      

      视图控制器:

      import UIKit
      
      class PortfolioViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, PortfolioCellDelegate {
      
          let getData = GetData()
      
          ...
      
      
          override func viewDidLoad() {
              super.viewDidLoad()        
      
              cellTableView.delegate = self
              cellTableView.dataSource = self
      
              cellTableView.register(UINib(nibName: "PortfolioCell", bundle: nil), forCellReuseIdentifier: "portfolioCell")
      
              self.currencyControl.selectedSegmentIndex = MyVariables.currencyControlSelected
      
              getData.delegate = self
      
              timeStampLabel.text = MyVariables.timeStamp
          }   
      
          override func viewDidAppear(_ animated: Bool) {
              super.viewWillAppear(animated)
              self.cellTableView.reloadData()
              self.currencyControl.selectedSegmentIndex = MyVariables.currencyControlSelected
              self.timeStampLabel.text = MyVariables.timeStamp
          }
      
          //MARK: - tableView
          /***************************************************************/
      
          ...
      
      
          func portfolioButtonPressed(coinCell: PortfolioCell, editingChangedInTextCell newValue: String) {
              let indexPath = self.cellTableView.indexPathForRow(at: coinCell.center)!
              let selectedCell = cellTableView.cellForRow(at: indexPath) as! PortfolioCell
      
              selectedCell.priceCell.isHidden = false
              selectedCell.textCell.isHidden = true
      
              if newValue != "XXX" {
                  let owned: Double = Double(newValue)!
                  MyVariables.dataArray[indexPath.row].ownedCell = owned
              }
      
              selectedCell.priceCell.isHidden = false
              selectedCell.textCell.isHidden = true
      
              self.cellTableView.reloadRows(at: [indexPath], with: .automatic)
          }
      
          func portfolioButtonPressed(didSelect coinCell: PortfolioCell) {
              let indexPath = self.cellTableView.indexPathForRow(at: coinCell.center)!
              let selectedCell = cellTableView.cellForRow(at: indexPath) as! PortfolioCell
      
              selectedCell.priceCell.isHidden = true
              selectedCell.textCell.isHidden = false
          }
              ...
      

      }

      【讨论】:

        【解决方案5】:

        很简单:您应该选择该表格视图单元格,然后在属性检查器中启用启用用户交互

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-17
          • 1970-01-01
          • 1970-01-01
          • 2012-03-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多