将新 UITableView 单元格的 textField 设为 firstResponder

Posted

技术标签:

【中文标题】将新 UITableView 单元格的 textField 设为 firstResponder【英文标题】:Making a new UITableView cell's textField the firstResponder 【发布时间】:2019-02-26 04:49:04 【问题描述】:

我目前有一个表格视图,其中包含一个标签和一个 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 - 使用文本字段委托或使用 tableView 委托方法 - indexPathForPreferredFocusedView.

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

【问题讨论】:

可以调用文本字段的 becomeFirstResponder 【参考方案1】:

致电 textField.becomeFirstResponder() method 应该可以满足您的需求。

何时调用此函数由您决定。例如在下面cellForRowAt 的代码中,我检查了该值是否为空,然后将当前文本字段设为第一响应者。

class Test: UIViewController
    
    var myView: TestViewreturn 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
    

【讨论】:

以上是关于将新 UITableView 单元格的 textField 设为 firstResponder的主要内容,如果未能解决你的问题,请参考以下文章

将新单元格插入排序的 UITableView 的有效方法?

UItableview 单元格的动态高度与 UItableview 单元格内的 UItableview

如何在 Swift 中动态更改包含 UICollectionView 单元格的 UITableView 单元格的高度?

不移动单元格的uitableview拖放

UITableView 中自定义单元格的 UITapGestureRecognizer

为啥 UITableView 的最后一个单元格的高度用于剩余的空单元格?