编辑文本字段时显示带有键盘和工具栏的 uitextview

Show uitextview with keypad and toolbar when editing textfield

实现您在 gif 中看到的内容的正确方法是什么?这是一个带有文本字段的表格视图。当您点击一个文本字段时,会显示一个带有键盘的文本视图。我有一个带有文本字段(valueTextField)的自定义 tableviewcell 的 tableview。在 cellforrow 中,我将文本字段的输入视图设置为 UITextView。当我按下文本字段时,文本视图应该在顶部显示工具栏(带有 "Done" 按钮)但没有显示工具栏。当我点击文本视图时,仍然没有工具栏。

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

    let cell = tableView.dequeueReusableCell(withIdentifier: "cellId", for: indexPath) as! EditProfileTableViewCell
    cell.isUserInteractionEnabled = true
    cell.valueTextField.isUserInteractionEnabled = true
    cell.valueTextField.delegate = self
    toolBar = UIToolbar()
    toolBar.sizeToFit()

    let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.plain, target: self, action: #selector(editorDone))
    toolBar.setItems([doneButton], animated: false)

    editorTextView = UITextView(frame: CGRect(x:0, y:0, width:view.bounds.width, height:view.bounds.height))
    cell.valueTextField.inputAccessoryView = toolBar
        cell.valueTextField.inputView = editorTextView

    return cell
}

您要更改的代码很少。

1) 这个视图的框架导致了那个奇怪的行为:

UITextView(frame: CGRect(x:0, y:0, width:view.bounds.width, height:view.bounds.height))

2)你之所以会犯这个错误,是因为你在混淆

.inputAccessoryView
.inputView

3) 您发布的gif 是基于navigationBar 按钮的。基本上,它通过点击单元格显示一个 detailedViewController,其中两个项目设置在 navigationBar

您展示的示例只是在点击单元格时使用 UINavigationController 导航到单独的 UIViewController。在此视图控制器中,UITextField 将像这样处理。

// View controller subclass conforming to UITextFieldDelegate protocol
class MyDetailViewController: UIViewController, UITextFieldDelegate {

    // Set an IB Outlet to the text field in storyboard
    @IBOutlet myTextField: UITextField!

    override viewDidLoad() {
        myTextField.delegate = self

        // ToolBar
        let toolBar = UIToolbar()
        // Optional styling
        toolBar.barStyle = .default
        toolBar.isTranslucent = true
        toolBar.tintColor = .black
        toolBar.layer.borderWidth = 0

        toolBar.sizeToFit()

        // Buttons
        let buttonOne = BarButtonItem(title: "One", style: .plain, target: self, action: #selector(yourSelectorOne(_:)))
        let buttonTwo = BarButtonItem(title: "One", style: .plain, target: self, action: #selector(yourSelectorTwo(_:)))

        let spacer = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)

       toolBar.setItems([buttonOne, spacer, buttonTwo], animated: false)
       toolBar.isUserInteractionEnabled = true
       textField.inputAccessoryView = toolBar
    }
}

这将创建两个按钮,一个在工具栏的左边,一个在工具栏的右边。键盘类型可以在Interface Builder中设置。

要通过直接点击单元格中的文本字段来实现这一点,而不需要导航到新的视图控制器,您可以将自定义 UITableViewCell 子类设置为文本字段委托。

请注意,您需要提供方法存根以符合 UITextFieldDelegate 协议。这些对于本示例而言不是必需的,因此我省略了它们。 XCode 会主动为您填充它们。