当前位置: 首页 > 面试题库 >

在Swift中从UITextView获取点击的单词

笪昌翰
2023-03-14
问题内容

我知道这个问题已经在Objective-
C中解决了,但是我在Swift中还没有看到任何解决方案。我试图转换这篇文章的解决方案代码,但出现错误:

func textTapped(recognizer: UITapGestureRecognizer){

    var textView: UITextView = recognizer.view as UITextView
    var layoutManager: NSLayoutManager = textView.layoutManager
    var location: CGPoint = recognizer.locationInView(textView)
    location.x -= textView.textContainerInset.left
    location.y -= textView.textContainerInset.top

    var charIndex: Int
    charIndex = layoutManager.characterIndexForPoint(location, inTextContainer: textView.textContainer, fractionOfDistanceBetweenInsertionPoints: nil)

    if charIndex < textView.textStorage.length {
        // do the stuff
        println(charIndex)
    }
}

我认为问题出在这一行(请参见此处的错误):

 var textView: UITextView = recognizer.view as UITextView

…我是根据以下内容从Objective-C转换而来的:

 UITextView *textView = (UITextView *)recognizer.view;

最后,对于如何调用此函数,我也有疑问。据我了解,该函数应传递给viewDidLoad()中的Selector,如下所示:

 let aSelector: Selector = "textTapped:"

 let tapGesture = UITapGestureRecognizer(target: self, action: aSelector)
 tapGesture.numberOfTapsRequired = 1
 view.addGestureRecognizer(tapGesture)

因为我遇到了前面提到的错误,所以不确定是否可以使用。但是我在想,我还需要将textTapped函数(识别器)中的参数传递到选择器中。但是,我读到您只能传递函数,不能传递任何参数。


问题答案:

您需要将添加UITapGestureRecognizerUITextView您希望能够点击的。您目前正在将添加UITapGestureRecognizerViewController的中view。这就是演员阵容让您陷入困境的原因。您正在尝试将UIView转换为UITextView

let tapGesture = UITapGestureRecognizer(target: self, action: #selector(textTapped))
tapGesture.numberOfTapsRequired = 1
myTextView.addGestureRecognizer(tapGesture)

从技术上讲,它recognizer.view是一个可选类型(UIView!),可以是nil,但是似乎textTapped()没有将您命名为未设置的类型。同样,layoutManager类型为NSLayoutManager!。为了安全起见,Swift的方法是:

guard let textView = recognizer.view as? UITextView, let layoutManager = textView.layoutManager else {
    return
}
// code using textView and layoutManager goes here

实际上,如果您以此方式编写,就不会崩溃,因为UIViewto 的条件强制转换UITextView不会成功。

为了使所有这些工作正常,请将属性添加到您将在textTapped例程中提取的属性字符串中:

var beginning = NSMutableAttributedString(string: "To the north you see a ")
var attrs = [NSFontAttributeName: UIFont.systemFontOfSize(19.0), "idnum": "1", "desc": "old building"]
var condemned = NSMutableAttributedString(string: "condemned building", attributes: attrs)
beginning.appendAttributedString(condemned)
attrs = [NSFontAttributeName: UIFont.systemFontOfSize(19.0), "idnum": "2", "desc": "lake"]
var lake = NSMutableAttributedString(string: " on a small lake", attributes: attrs)
beginning.appendAttributedString(lake)
myTextView.attributedText = beginning

这是完整的textTapped

@objc func textTapped(recognizer: UITapGestureRecognizer) {
    guard let textView = recognizer.view as? UITextView, let layoutManager = textView.layoutManager else {
        return
    }
    var location: CGPoint = recognizer.locationInView(textView)
    location.x -= textView.textContainerInset.left
    location.y -= textView.textContainerInset.top

    /* 
    Here is what the Documentation looks like :

    Returns the index of the character falling under the given point,    
    expressed in the given container's coordinate system.  
    If no character is under the point, the nearest character is returned, 
    where nearest is defined according to the requirements of selection by touch or mouse.  
    This is not simply equivalent to taking the result of the corresponding 
    glyph index method and converting it to a character index, because in some 
    cases a single glyph represents more than one selectable character, for example an fi ligature glyph.
    In that case, there will be an insertion point within the glyph, 
    and this method will return one character or the other, depending on whether the specified 
    point lies to the left or the right of that insertion point.  
    In general, this method will return only character indexes for which there 
    is an insertion point (see next method).  The partial fraction is a fraction of the distance 
    from the insertion point logically before the given character to the next one, 
    which may be either to the right or to the left depending on directionality.
    */
    var charIndex = layoutManager.characterIndexForPoint(location, inTextContainer: textView.textContainer, fractionOfDistanceBetweenInsertionPoints: nil)

    guard charIndex < textView.textStorage.length else {
        return
    }

    var range = NSRange(location: 0, length: 0)
    if let idval = textView.attributedText?.attribute("idnum", atIndex: charIndex, effectiveRange: &range) as? NSString {
        print("id value: \(idval)")
        print("charIndex: \(charIndex)")
        print("range.location = \(range.location)")
        print("range.length = \(range.length)")
        let tappedPhrase = (textView.attributedText.string as NSString).substringWithRange(range)
        print("tapped phrase: \(tappedPhrase)")
        var mutableText = textView.attributedText.mutableCopy() as NSMutableAttributedString
        mutableText.addAttributes([NSForegroundColorAttributeName: UIColor.redColor()], range: range)
        textView.attributedText = mutableText
    }
    if let desc = textView.attributedText?.attribute("desc", atIndex: charIndex, effectiveRange: &range) as? NSString {
        print("desc: \(desc)")
    }
}


 类似资料:
  • 问题内容: 我一直在尝试在我的应用程序中实现一项功能,以便当用户在我的表格视图中点击一个单元格时,该单元格会向下扩展以显示注释。我在Objective- C中找到了很多这样的例子,但是我还没有找到Swift的例子。 我试图将其翻译为Swift: 但是,这似乎使应用程序崩溃了。 有任何想法吗? 编辑: 这是我的cellForRowAtIndexPath代码: 这是插座设置: 问题答案: if语句中的

  • 问题内容: 我一直在尝试以及如何使用它的光标位置。 但是由于我正在使用Swift,所以我想学习如何获取当前光标位置以及如何在Swift中进行设置。 下面的答案是我从Objective-C进行实验和翻译的结果。 问题答案: 以下内容适用于和。 文本字段文本的最开始: 文本字段文本的末尾: 当前选择的范围: 获取光标位置 设定光标位置 为了设置位置,所有这些方法实际上都是使用相同的开始值和结束值来设置

  • 问题内容: 我使用WKWebView登录到一个网站,现在我想解析该网站的html。如何快速访问HTML网站?我知道它如何用于UIWebView但不适用于WKWebView。 谢谢你的帮助! 问题答案: 如果您等到页面加载完毕,则可以使用: 您还可以注入一些JavaScript,使您返回HTML。 您可以注入的javascript如下所示:

  • 问题内容: 当用户单击UILocalNotification时,我试图迅速从应用程序委托中加载特定的ViewController。我已经知道这是在此函数中调用的: 但是当我尝试访问一个打开的ViewController时,我认为它返回null,因为我的应用程序崩溃了。这是我正在尝试的: 在popToViewController行上崩溃了。 问题答案: 您可以尝试: 斯威夫特3:

  • 我需要从一组div中的一个点击的div中获取输入值。 现在脚本 这将返回第一个div的值,无论我单击哪个div。

  • 本文向大家介绍jQuery获取单击节点对象的方法,包括了jQuery获取单击节点对象的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了jQuery获取单击节点对象的方法。分享给大家供大家参考,具体如下: event.target属性: 解释: 其中event.target 即为触发单击事件的对象 (有可能是容器内部的某个控件) PS:这里再为大家推荐几款代码格式化、美化工具,相信大家在