我一直在努力用Swift检测UITextView上的点击。
我的UITextViews在一个表中,我必须能够检测链接并按下它们,这些链接长度未知。
此外,如果我点击单元格,我没有点击链接,我想在我的导航控制器堆栈上推送一个新的UIViewController。
我尝试创建自己的textview来覆盖touchesCancelled,但它并没有成功。它检测到取消,该取消不被认为是真实设备上的点击。
该模拟器中没有出现错误,但似乎我无法点击真实设备,只需长按即可。
class LinkTextView: UITextView{
override func touchesCancelled(touches: Set<NSObject>!, withEvent event: UIEvent!) {
self.textViewWasTapped(self)
}
}
我尝试直接添加手势识别器。我也没有取得任何成功。它根本不会调用手势识别器。
我将UIGestureReconizer委托添加到我的UIViewController和我的
中的那些行func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var singleTap : UIGestureRecognizer = UIGestureRecognizer(target: self, action: "tapTextView:")
singleTap.delegate = self
cell.mTextOutlet.attributedText = myMutableString
cell.mTextOutlet.addGestureRecognizer(singleTap)
在我的LinkTextView类中:
class LinkTextView: UITextView{
func tapTextView(stapGesture: UIGestureRecognizer){
println("TAPPING1")
}
}
我看了论坛,发现了这篇文章:post。它建议使用CHHLinkTextView。我尝试使用它,但我想要的是自动检测链接,正常的uitextview实际上是这样。
我确实尝试使用界面构建器中的checkBox来解析CHHLinkTextView的链接,但它不起作用。我没有在文档中看到任何暗示它可以完成的内容。
我该怎么办?
答案 0 :(得分:8)
您在第一次尝试子类化UITextView
时非常接近,但不是仅覆盖touchesCancelled
,而是要覆盖所有touches*
方法,即
touchesBegan
touchesMoved
touchesEnded
touchesCancelled
在重写的方法中,通过获取textView&#39; s nextResponder()
向下发送响应链,检查它是不是nil
,然后在下一个方法中调用方法响应者。
这可行的原因是因为UITextView
会拦截触摸,如果它在网址上并且永远不会调用UIResponder
方法 - 请通过实施{{ 1}}在你的tableViewCell中或任何地方,你会在任何触摸事件传递之前看到它被调用。
这应该是您尝试做的最低限度(它重复但很短):
textView:shouldInteractWithURL:inRange
答案 1 :(得分:6)
我做了,因为Ralfonso说没有成功,但它帮助我意识到我有一个手势识别器冲突。事实证明我没有必要覆盖UITextView的所有4种方法,我只是覆盖了touchesBegan。 我在viewDidLoad中做的是添加一个手势识别器来关闭键盘:
var tapOutTextField: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissKeyboard")
self.view.addGestureRecognizer(tapOutTextField)
什么没有意义并且让我走错方向的是,touchesBegan实际上是在延迟后被调用的(因此是touchCancelled),我无法获得与UIButton相同的行为。所有这一切都是因为这种手势识别器冲突。