将新的UITableView单元格的textField设置为firstResponder

时间:2019-02-26 04:49:05

标签: swift uitableview uitextfield

我目前有一个表格视图,其中的单元格包含一个标签和一个textfield,还有一个+栏按钮项,用于添加新的单元格。

我希望完成的是,当用户按下+按钮时,将创建新的单元格,并且该单元格的文本字段将自动成为第一响应者。

以下是我当前用于创建新条目的代码:

    func newNoteline() {
    let entityDescription = NSEntityDescription.entity(forEntityName: "NotebookContentEntity", in: context)

    let item = NotebookContentEntity(entity: entityDescription!, insertInto: context)

    item.notebookEntry = ""
    item.timeOfEntry = timeOutlet.text

    do {

        try context.save()
    } catch {
        print(error)
        return
    }
    loadNotelines()
    }

我已经想到了几种解决方法,但并没有使它们正常工作的运气,包括在文本字段完成后立即在文本字段上使用.tag-使用文本字段委托或使用{{ 1}}委托方法-tableView

我只是想不知道如何在没有用户点击文本字段的情况下将焦点强加到单元格中的特定文本字段。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

调用 textField。becomeFirstResponder() 方法应该可以满足您的需求。何时调用此功能由您决定。例如在以下代码的 cellForRowAt 中,我检查了该值是否为空,然后使当前文本字段成为第一响应者。

   class Test: UIViewController{

        var myView: TestView{return view as! TestView}
        unowned var tableView: UITableView {return myView.tableView}
        unowned var button: UIButton {return myView.button}

        var list = [String]()

        override func loadView() {
            view = TestView()
        }

        override func viewDidLoad() {
            super.viewDidLoad()
            for i in 1...10{
                list.append("Test \(i)")
            }
            tableView.dataSource = self
            button.addTarget(self, action: #selector(didSelect(_:)), for: .touchUpInside)
        }

        @objc func didSelect(_ sender: UIButton){
            let indexPath = IndexPath(row: list.count, section: 0)
            list.append("")
            tableView.insertRows(at: [indexPath], with: .automatic)
            tableView.scrollToRow(at: indexPath, at: .bottom, animated: true)
        }
    }
    extension Test: UITableViewDataSource{
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return list.count
        }

        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "TestViewCell", for: indexPath) as! TestViewCell
            let value = list[indexPath.row]
            cell.textField.text = value
            if value.isEmpty{
                cell.textField.becomeFirstResponder()
            }
            return cell
        }
    }
相关问题