【发布时间】:2016-07-13 17:50:02
【问题描述】:
我在表格单元格中使用文本视图。其他单元格与 segues 相关联,因此我需要以下行为:
(默认)点击其他表行会触发相关的segue
在文本视图内点击开始编辑并显示键盘
如果键盘可见,则在文本视图之外点击会关闭键盘,但不会跟随 segues
关闭键盘后,接下来会点击 segues。
【问题讨论】:
标签: ios swift xcode uitableview uitextview
我在表格单元格中使用文本视图。其他单元格与 segues 相关联,因此我需要以下行为:
(默认)点击其他表行会触发相关的segue
在文本视图内点击开始编辑并显示键盘
如果键盘可见,则在文本视图之外点击会关闭键盘,但不会跟随 segues
关闭键盘后,接下来会点击 segues。
【问题讨论】:
标签: ios swift xcode uitableview uitextview
1.采用textView委托方法和
textView.delegate = self
2。添加全局属性
var tap = UITapGestureRecognizer()
3。实现textView 委托方法
func textViewDidBeginEditing(textField: UITextView) {
self.tableView.allowsSelection = false
tap = UITapGestureRecognizer(target: self, action: #selector(self.Tapped))
self.view.addGestureRecognizer(tap)
}
func textViewDidEndEditing(textField: UITextView) {
self.tableView.allowsSelection = true
self.view.removeGestureRecognizer(tap)
}
4.实现 Tapped()
func Tapped(){
view.endEditing(true)
}
注意:这也适用于 UITextField,将 View 替换为 Field
【讨论】:
将 UITextViewDelegate 协议添加到您的类并添加这些变量
var textViewIsEditing:Bool = false
var tap: UITapGestureRecognizer!
重写 viewdidload 函数,以便 tableViewController 监听来自文本视图的事件。
另外添加一个UITapGestureRecognizer,它会触发一个自定义的handleTap函数
override func viewDidLoad() {
super.viewDidLoad()
myTextView.delegate = self
tap = UITapGestureRecognizer(target: self, action: #selector(MyClass.handleTap))
tap.cancelsTouchesInView = false
self.view.addGestureRecognizer(tap)
}
添加两个函数,根据textview是否正在编辑来切换textViewIsEditing
func textViewDidEndEditing(textView: UITextView) {
textViewIsEditing = false
}
func textViewDidBeginEditing(textView: UITextView) {
textViewIsEditing = true
}
现在添加一个自定义的 handleTap 函数来决定如何处理点击:
func handleTap(thisGestureRecognizer:UITapGestureRecognizer){
if(textFieldIsEditing){
// ignore this tap if editing text field but end editing
tap.cancelsTouchesInView = true
view.endEditing(true)
}else{
// proceed as normal
tap.cancelsTouchesInView = false
}
}
【讨论】: