代码之家  ›  专栏  ›  技术社区  ›  Jan Moravek

UITextField不会在Swift 4中的UITableViewCell中结束编辑

  •  1
  • Jan Moravek  · 技术社区  · 8 年前

    我对斯威夫特还是新手,我想征求你的意见。提前谢谢你,对不起我的英语不好。

    我的目标是:

    用户点击表格行中的编辑按钮。 UITextField 而是显示单元格。输入值并按后 Return 钥匙 输入框 再次消失并重新计算单元格。

    editButton 按下->隐藏 priceCell &显示 输入框 &&显示键盘;开始编辑/输入值(光标闪烁)->停止编辑/输入值按执行 回来 键->隐藏 输入框 &显示 priceCell公司 &将输入的值保存到数组中(&A);重新加载编辑的行

    我使用 this 回答为起始蓝图。

    我还想使用 .decimalPad 键盘可以更方便地输入数值,并限制用户仅使用数字(和小数点),但这不包括使用 回来 键为停止编辑,对吗?

    我发现 this 可能的解决方案,但我觉得我的问题很复杂。。。

    我的ViewController:

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

    enter image description here

    现在当按钮被正确按下时 输入框 显示,但不要在 回来 按键。

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

    5 回复  |  直到 8 年前
        1
  •  0
  •   Tj3n    8 年前

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

    cellTableView.keyboardDismissMode = .onDrag
    

    cellTableView.keyboardDismissMode = .interactive
    

    当您与tableView交互时,它将隐藏键盘

        2
  •  0
  •   Sneha    8 年前

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

        3
  •  0
  •   Tomo Norbert    8 年前

    有两条路要走:

    1)代表 2)IQKeyboardManager

    1.) 使用UITextFieldDelegate

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

    2.) 使用IQKeyboardManager一行程序库。此库自动管理所有文本字段和滚动视图。您可以在AppDelegate中用一行代码激活它,以便使用。

    https://github.com/hackiftekhar/IQKeyboardManager

        4
  •  0
  •   Jan Moravek    8 年前

    工作,但不是像我想要的那样光滑,而且我也没有能力 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
  •  0
  •   Saeed Ir    7 年前

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