草庐IT

ios - Swift - Textview 识别点击的单词不起作用

coder 2023-09-08 原文

老用户,第一次发布,所以如果我在提出问题时有任何错误,我深表歉意。我已经为此工作了几个小时,我决定是时候请教专家了。我还搜索了所有已“回答”和工作的类似问题,这让我相信它们已经过时了。

我正在尝试从稍后将在代码中使用的 UITextview 中获取点击的单词。比如 TextView 中有一段话:

“最初的时间投资返回要小得多,因为他用前期成本换取了公司的汗水股权,但潜在的长期返回要大得多”。

我希望能够点击一个词,例如'investment',并通过另一个函数运行它来定义它。然而,简单地点击这个词,程序就会崩溃,而且我没有收到被点击的词。

我实现了一个点击手势识别器:

let tap = UITapGestureRecognizer(target: self, action: #selector(tapResponse(_:)))
    tap.delegate = self
    tvEditor.addGestureRecognizer(tap)

然后写了函数:2

func tapResponse(recognizer: UITapGestureRecognizer) {
    let location: CGPoint = recognizer.locationInView(tvEditor)
    let position: CGPoint = CGPointMake(location.x, location.y)
    let tapPosition: UITextPosition = tvEditor.closestPositionToPoint(position)!
    let textRange: UITextRange = tvEditor.tokenizer.rangeEnclosingPosition(tapPosition, withGranularity: UITextGranularity.Word, inDirection: 1)!

    let tappedWord: String = tvEditor.textInRange(textRange)!
    print("tapped word : %@", tappedWord)
}

理想情况下,这应该从 Textview 的点击部分获取 location,通过获取 .x 和 .y 获取 position,然后查看 Textview在离position最近的点,找到Range粒度包围位置(返回单词),并将内容设置为字符串,我目前只是打印到控制台。但是,在点击这个词时,我收到了这个崩溃。 3

以及控制台中的“ fatal error :在展开可选值时意外发现 nil”

如有任何帮助,我们将不胜感激。我可能只是遗漏了一些简单的东西,或者它可能会复杂得多。

最佳答案

  • 每当在单词之间的空格处接收到点击时,TextView 返回的 tapPosition 可以为 nil nil
  • Swift 有一个新的运算符叫做 optional ?,它告诉编译器变量可能有 nil 值。如果在变量名后不使用?表示变量永远不能有nil值。
  • 在 Swift 中,使用 ! 运算符意味着您强制编译器强制从可选变量中提取值。因此,在那种情况下,如果变量的值为 nil,它将在强制时崩溃。

所以,实际发生的是

  • 您正在创建变量 let tapPosition: UITextPositionlet textRange: UITextRangelet tappedWord: String 不是可选的
  • myTextView.closestPositionToPoint(position)方法的返回类型,tvEditor.textInRange(textRange)是可选变量UITextPosition?字符串?
  • 将可选变量的值赋给非可选变量需要 !
  • 该方法返回 nil 并且您强制它获取值 ! 导致崩溃

你能做什么

  • 在强制任何可选变量之前,只需确保它具有一些使用值

    if variable != nil
    {
        print(variable!)
    }
    

正确的方法是

func tapResponse(recognizer: UITapGestureRecognizer) {
    let location: CGPoint = recognizer.locationInView(myTextView)
    let position: CGPoint = CGPointMake(location.x, location.y)
    let tapPosition: UITextPosition? = myTextView.closestPositionToPoint(position)
    if tapPosition != nil {
        let textRange: UITextRange? = myTextView.tokenizer.rangeEnclosingPosition(tapPosition!, withGranularity: UITextGranularity.Word, inDirection: 1)
        if textRange != nil
        {
            let tappedWord: String? = myTextView.textInRange(textRange!)
            print("tapped word : ", tappedWord)
        }
    }
}

关于ios - Swift - Textview 识别点击的单词不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38136587/

有关ios - Swift - Textview 识别点击的单词不起作用的更多相关文章

  1. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  2. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

  3. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  4. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  5. 报告回顾丨模型进化狂飙,DetectGPT能否识别最新模型生成结果? - 2

    导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri

  6. [Vuforia]二.3D物体识别 - 2

    之前说过10之后的版本没有3dScan了,所以还是9.8的版本或者之前更早的版本。 3d物体扫描需要先下载扫描的APK进行扫面。首先要在手机上装一个扫描程序,扫描现实中的三维物体,然后上传高通官网,在下载成UnityPackage类型让Unity能够使用这个扫描程序可以从高通官网上进行下载,是一个安卓程序。点到Tools往下滑,找到VuforiaObjectScanner下载后解压数据线连接手机,将apk文件拷入手机安装然后刚才解压文件中的Media文件夹打开,两个PDF图打印第一张A4-ObjectScanningTarget.pdf,主要是用来辅助扫描的。好了,接下来就是扫描三维物体。将瓶

  7. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  8. ruby-on-rails - 在 heroku 的 .fonts 文件夹中包含自定义字体,似乎无法识别它们 - 2

    Heroku支持人员告诉我,为了在我的Web应用程序中使用自定义字体(未安装在系统中,您可以在bash控制台中使用fc-list查看已安装的字体)我必须部署一个包含所有字体的.fonts文件夹里面的字体。问题是我不知道该怎么做。我的意思是,我不知道文件名是否必须遵循heroku的任何特殊模式,或者我必须在我的代码中做一些事情来考虑这种字体,或者如果我将它包含在文件夹中它是自动的......事实是,我尝试以不同的方式更改字体的文件名,但根本没有使用该字体。为了提供更多详细信息,我们使用字体的过程是将PDF转换为图像,更具体地说,使用rghostgem。并且最终图像根本不使用自定义字体。在

  9. ruby - 正则表达式将非英文字母匹配为非单词字符 - 2

    @raw_array[i]=~/[\W]/非常简单的正则表达式。当我用一些非拉丁字母(具体来说是俄语)尝试时,条件是错误的。我能用它做什么? 最佳答案 @raw_array[i]=~/[\p{L}]/使用西里尔字符进行测试。引用:http://www.regular-expressions.info/unicode.html#prop 关于ruby-正则表达式将非英文字母匹配为非单词字符,我们在StackOverflow上找到一个类似的问题: https://

  10. Python 刷Leetcode题库,顺带学英语单词(31) - 2

    ValidPalindromeGivenastring,determineifitisapalindrome,consideringonlyalphanumericcharactersandignoringcases. [#125]Example:"Aman,aplan,acanal:Panama"isapalindrome."raceacar"isnotapalindrome.Haveyouconsiderthatthestringmightbeempty?Thisisagoodquestiontoaskduringaninterview.Forthepurposeofthisproblem

随机推荐