这是 a previous answer of mine问题 a previous answer of mine的补充问题.

我使用Xcode 7.1.1和iOS 9.1重新测试了以下代码,它可以与我链接的答案中描述的设置一起使用.

import UIKit
class ViewController: UIViewController,UIGestureRecognizerDelegate {

    @IBOutlet weak var textView: UITextView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Create an attributed string
        let myString = NSMutableAttributedString(string: "Swift attributed text")

        // Set an attribute on part of the string
        let myRange = NSRange(location: 0,length: 5) // range of "Swift"
        let myCustomAttribute = [ "MyCustomAttributeName": "some value"]
        myString.addAttributes(myCustomAttribute,range: myRange)

        textView.attributedText = myString

        // Add tap gesture recognizer to Text View
        let tap = UITapGestureRecognizer(target: self,action: Selector("myMethodToHandleTap:"))
        tap.delegate = self
        textView.addGestureRecognizer(tap)
    }

    func myMethodToHandleTap(sender: UITapGestureRecognizer) {

        let myTextView = sender.view as! UITextView
        let layoutManager = myTextView.layoutManager

        // location of tap in myTextView coordinates and taking the inset into account
        var location = sender.locationInView(myTextView)
        location.x -= myTextView.textContainerInset.left;
        location.y -= myTextView.textContainerInset.top;

        // character index at tap location
        let characterIndex = layoutManager.characterIndexForPoint(location,inTextContainer: myTextView.textContainer,fractionOfdistanceBetweenInsertionPoints: nil)

        // if index is valid then do something.
        if characterIndex < myTextView.textStorage.length {

            // print the character index
            print("character index: \(characterIndex)")

            // print the character at the index
            let myRange = NSRange(location: characterIndex,length: 1)
            let substring = (myTextView.attributedText.string as Nsstring).substringWithRange(myRange)
            print("character at index: \(substring)")

            // check if the tap location has a certain attribute
            let attributeName = "MyCustomAttributeName"
            let attributeValue = myTextView.attributedText.attribute(attributeName,atIndex: characterIndex,effectiveRange: nil) as? String
            if let value = attributeValue {
                print("You tapped on \(attributeName) and the value is: \(value)")
            }

        }
    }
}

但是,如果更改了UITextView设置,则它既可编辑又可选

然后这将导致键盘显示.显示键盘后,不再调用tap事件处理程序.在键盘显示时可以做些什么来检测属性文本的点击?

更新

虽然这里的代码是在Swift中,但最初提出这个问题的人(在我上面链接的答案的评论中)正在使用Objective-C.所以我很乐意接受Swift或Objective-C的答案.

解决方法

在您的UITextView控制器中,您可以实现UITextViewDelegate,然后覆盖方法
-(BOOL)textViewShouldBeginEditing:(UITextView *)textView{
}

在此方法中,您可以访问textView的selectedRange,它也应该是您的属性文本的“tap range”.然后根据您的需要返回true / false.

ios – 在键盘显示时检测UITextView中属性文本的点击的更多相关文章

  1. ios – Reactive Cocoa – 以编程方式设置文本时不会调用UITextView的rac_textSignal

    我正在实现一个聊天UI,并使用ReactiveCocoa根据用户的类型调整聊天气泡的大小.目前,我正在基于textview的rac_textSignal更新UI的布局.一切都很好–除了一点:当用户发送消息时,我以编程方式清除文本字段:…我是否需要拥有一个持有currentTypedString的Nsstring,并在该字符串更新时驱动UI更改?

  2. 如何让我的UITextView在iOS 7下的屏幕高度减去键盘?

    我的代码在iOS6下运行正常,但在iOS7下我似乎无法使我的UITextView设备屏幕的高度减去键盘(换句话说,当键盘启动时,让UITextView仍然是全屏,但是不要去键盘下面).首先,当我将UITextView放入我的视图控制器(嵌入在导航控制器中)时,它也必须位于导航栏下,否则它会开始太远.从那里我尝试了所有这些例子:每个键盘的位置仍然会在某些点上超过textview.我也试过设置一个高度

  3. iOS – UIToolBar作为UITextView的inputAccessoryView

    这是我的代码:解决方法如果工具栏中没有其他附近的按钮,工具栏似乎会将按钮的活动区域扩展到其边界之外.Apple工程师必须认为最好是猜测用户打算按哪个而不是根本不做出反应.

  4. ios – colorWithPatternImage在io6中不起作用?

    我正在使用colorWithPatternImage来更改UITextView的文本颜色.它在IO7中工作正常,但在IO6中不起作用.这是我的代码:–解决方法UITextView的内部在iOS6和7之间发生了巨大的变化.在iOS7之前,UITextView不支持文本颜色的图案颜色.有几个组件在iOS7中获得了对图案颜色的支持,而UITextView就是其中之一.

  5. UITextView startInteractionWithLinkAtPoint仅崩溃iOS 11

    因此,当用户与URL链接进行交互时,我在UItextview中遇到崩溃.所有崩溃报告仅限iOS版本11.这看起来像iOS9中众所周知的bug,但是没有单个报告iOS版本低于11,而且在报告中我发现有趣的行:iOS11(http://developer.limneos.net/?ios=11.0&framework=UIKit.framework&header=UITextGestureCluste

  6. ios – Swift,移动键盘后面的内容在关闭后不会重置

    我在我的一个VC中有一个uiscrollview.在scrollView中,我有多个TF,按钮等.我使用下面的代码,根据Apple文档,在调用键盘通知时向上移动scrollView,以推高隐藏的文本字段.但是,当我关闭键盘时,scrollView不会重置或向下移动,它只是停留在“向上移动”的位置.我在这里错过了什么吗?我有一个名为的类的成员变量:我是否正确使用了委托方法?解决方法我这样做了,它对我有用.似乎比你的方式容易多了.我为我的项目使用了UITextView.但它应该与UITextField一样.–

  7. ios – Xcode 7 – 有些segues不再工作了

    如果确实如此,那么Xcode7/iOS9中存在一个错误,如果您在storyboard中设置了默认文本值,则无法启动包含UITextView的模式.解决方法是确保故事板中的UITextView为空白或具有默认的LoremIpsem值,而是在viewDidLoad上的代码中以编程方式设置文本.希望这个错误很快就会修复.

  8. ios – iPad上的UIModalPresentationFormSheet.键盘出现时如何调整UITextView高度

    UITextView是模态控制器视图的子视图.当键盘出现时,我需要降低UITextView高度,以便UITextView的底部边框y坐标等于键盘的顶部y坐标.我想要键盘高度问题是当键盘出现时,此模态视图会跳起来.在这种情况下如何计算键盘的顶部边框坐标?解决方法你可以这样做:请记得取消注册通知.

  9. ios7 – iOS 7 UITextView:重新打开应用程序后,nstextattachment的大小增加2倍

    如果是视网膜,您可能需要在存放前将尺寸缩小50%.试试这个怎么样:–

  10. ios – 在UITextView上替换属性文本时维护自定义属性

    我有一个可编辑的UITextView,它加载了一个属性String.此属性String加载了应用程序设置的自定义属性.出于这个原因,我总是将这些自定义属性添加到textView的typingAttributes中.每当我输入文本时它按预期工作,添加的文本都设置了自定义属性,但每当我使用预测性建议替换单词时,整个单词都设置为没有自定义属性.据我所知,每次以编程方式设置属性文本时,将自动清除typingAttributes.因此,当选择预测建议时,文本会以编程方式设置,因此我丢失了所有自定义属性.有没有办法解

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部