如何在swift中突出显示文本时触发事件

Posted

技术标签:

【中文标题】如何在swift中突出显示文本时触发事件【英文标题】:How to trigger an event when text is highlighted in swift 【发布时间】:2019-05-13 21:25:04 【问题描述】:

我想制作一个图书应用程序,用户可以在其中阅读其中的章节。我想添加一个功能,用户可以在其中突出显示文本并将其保留在应用程序中以供将来参考。快速选择文本后,如何触发事件(如带有突出显示图标的按钮)?请帮忙

我已经用谷歌搜索了好几个小时了,什么也没有

//
//  ViewController.swift
//  platesofned
//
//  Created by Mauricio Kiyama on 5/13/19.
//  Copyright © 2019 Mauricio Kiyama. All rights reserved.
//

import UIKit

class ViewController: UIViewController 

    let myTextView: UITextField = 
        let label = UITextField()
        label.translatesAutoresizingMaskIntoConstraints = false
        label.text = "Hello World"
        label.isSelected = true
        label.textColor = .black
        return label
    ()


    override func viewDidLoad() 
        super.viewDidLoad()

        view.addSubview(myTextView)
        myTextView.widthAnchor.constraint(equalToConstant: 100).isActive = true
        myTextView.heightAnchor.constraint(equalToConstant: 100).isActive = true
        myTextView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        myTextView.topAnchor.constraint(equalTo: view.topAnchor, constant: 100).isActive = true

        if let textRange = myTextView.selectedTextRange 

            let selectedText = myTextView.text(in: textRange)

            print(selectedText)
        
    




我想要一个在选择任何文本后有按钮的框。

【问题讨论】:

也许这可以帮助***.com/questions/26454037/…,我真的想不出任何东西,也许如果你有更多的代码 你在说什么文字?在文本字段中?所以你想知道文本字段中的选择什么时候发生了变化? 不相关,但将文本字段属性命名为 myTextView 而不是 myTextField 确实令人困惑。 【参考方案1】:

假设您询问如何在 UITextField 中的选择更改时获取事件,您需要将观察者添加到 UITextField 的“selectedTextRange”属性(来自 UITextInput 协议)。

这是一个小示例视图控制器,它为文本字段侦听此类事件:

class MyVC: UIViewController 
    var textField: UITextField!

    @objc override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) 
        if keyPath == "selectedTextRange" 
            if let tf = object as? UITextField 
                // This is our event and text field
                if let range = tf.selectedTextRange 
                    print("Updated selection = \(range)")
                

                return
            
        

        // This isn't the event or the object we care about, pass it on
        super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
    

    override func viewDidLoad() 
        super.viewDidLoad()

        view.backgroundColor = .yellow

        textField = UITextField(frame: CGRect(x: 0, y: 0, width: 300, height: 44))
        textField.text = "Hello there. How are you?"

        // Options is empty because we don't care about the old range and we can get the new range from the text field
        textField.addObserver(self, forKeyPath: "selectedTextRange", options: [], context: nil)

        view.addSubview(textField)
    

    deinit 
        textField.removeObserver(self, forKeyPath: "selectedTextRange")
    

【讨论】:

以上是关于如何在swift中突出显示文本时触发事件的主要内容,如果未能解决你的问题,请参考以下文章

swing - 触发树单元格编辑事件

Swift 如何在另一个 UITextField 突出显示或具有值时禁用 TextField

在 Swift (tvOS) 中,如何更改 UIButton 的突出显示和焦点颜色?

如何使用 Javascript 鼠标事件和 CSS 重新创建“突出显示”选择?

swift 突出显示文本中的链接

如何使用 swift ui 显示突出显示的单词