编辑文本字段时显示带有键盘和工具栏的 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 会主动为您填充它们。
实现您在 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 会主动为您填充它们。