天道酬勤,学无止境

is it possible to get the index (String.Index) value from the cursor position of a UITextView element in Swift?

问题
回答1

您可以获取从文档开头到所选范围开头的选定范围偏移量,并使用该偏移量获取字符串索引,如下所示:

extension UITextView {
    var cursorOffset: Int? {
        guard let range = selectedTextRange else { return nil }
        return offset(from: beginningOfDocument, to: range.start)
    }
    var cursorIndex: String.Index? {
        guard let location = cursorOffset else { return nil }
        return Range(.init(location: location, length: 0), in: text)?.lowerBound
    }
    var cursorDistance: Int? {
        guard let cursorIndex = cursorIndex else { return nil }
        return text.distance(from: text.startIndex, to: cursorIndex)
    }
}

class ViewController: UIViewController, UITextViewDelegate {
    @IBOutlet weak var textView: UITextView!
    override func viewDidLoad() {
        super.viewDidLoad()
        textView.delegate = self
    }
    func textViewDidChangeSelection(_ textView: UITextView) {
        print("Cursor UTF16 Offset:",textView.cursorOffset ?? "")
        print("Cursor Index:", textView.cursorIndex ?? "")
        print("Cursor distance:", textView.cursorDistance ?? "")
    }
}
标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • is it possible to get the index (String.Index) value from the cursor position of a UITextView element in Swift?
    I'm looking to pull the index value (String.Index) from the user cursor position of a UITextView element. I'm using the selectedTextRange method to get the UITextRange value. How can I use that to retrieve the index value?
  • 是否可以在不插入新行的情况下获得用户输入?(Possible to get user input without inserting a new line?)
    问题 我知道我可以通过添加逗号来停止打印换行符 print "Hello, world!", 但是,如何阻止raw_input编写换行符? print "Hello, ", name = raw_input() print ", how do you do?" 结果: 你好,托马斯 , 你好吗? 结果我想要: 你好,托马斯,你好吗? 回答1 但是,如何停止raw_input编写换行符? 简而言之:你不能。 raw_input()将始终回显用户输入的文本,包括结尾的换行符。 这意味着无论用户键入什么内容,都将被打印到标准输出中。 如果要防止这种情况,则必须使用终端控制库,例如curses模块。 但是,这不是可移植的,例如, curses在Windows系统上不可用。 回答2 这在某种程度上规避了它,但是没有给变量name分配任何东西: print("Hello, {0}, how do you do?".format(raw_input("Enter name here: "))) 但是,在打印整个消息之前,它将提示用户输入名称。 回答3 我看到没有人提供可行的解决方案,因此我决定可以尝试一下。 正如Ferdinand Beyer所说的那样,在用户输入之后,不可能使raw_input()不打印新行。 但是,可以回到之前的状态。 我把它做成了单线。 您可以使用: print '\033
  • 如何通过值而不是位置来设置微调框的选定项目?(How to set selected item of Spinner by value, not by position?)
    问题 我有一个更新视图,在该视图中,我需要预先选择存储在数据库中的Spinner值。 我当时有这样的想法,但是Adapter没有indexOf方法,所以我陷入了困境。 void setSpinner(String value) { int pos = getSpinnerField().getAdapter().indexOf(value); getSpinnerField().setSelection(pos); } 回答1 假设您的Spinner名为mSpinner ,并且它包含以下选项之一:“某个值”。 要查找和比较微调器中“某些值”的位置,请使用以下命令: String compareValue = "some value"; ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.select_state, android.R.layout.simple_spinner_item); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mSpinner.setAdapter(adapter); if (compareValue != null) { int
  • MySQL 高级部分
    (1)索引(index)..................................................................... 1 (2)视图(view)....................................................................... 2 (3)触发器(trigger)............................................................. 6 (4)游标(cursor)...................................................................... 8 (5)事务(Transaction)............................................................. 10 (6)存储过程(Stored Procedure).......................................... 12 索引是一个单独的、物理的数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。 优点: 大大加快数据的检索速度; 创建唯一性索引,保证数据库表中每一行数据的唯一性
  • 如何强制 QCompleter 检查 QLineEdit 中的第二个单词(How to force QCompleter to check second word in QLineEdit)
    问题 我有一个功能可以实现带有自动完成功能的文本框。 我找到了一个使用 QLineEdit 和 QCompleter 的代码。 因此我有我的字符串值, "one" , "two" , "three" 等。 一旦我输入“on”,完成者就会向我建议列表中带有前缀“on”的每个单词。 但是在我从列表中选择“一个”并尝试输入第二个单词后,完成器不起作用。 QCompleter 或 Qt 中是否有提供此类功能的功能。 我在文档中找到了它。 查看我找到的代码: #include <QApplication> #include<QStringList> #include<QLineEdit> #include<QCompleter> #include<QHBoxLayout> #include<QWidget> #include<QLabel> int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget *win=new QWidget(); QHBoxLayout *lay=new QHBoxLayout(); QStringList wordList; wordList << "alpha" << "omega" << "omicron" << "zeta"<<"america"<<"orion"<<"amit
  • 格式化UITextField以进行信用卡输入,例如(xxxx xxxx xxxx xxxx)(Formatting a UITextField for credit card input like (xxxx xxxx xxxx xxxx))
    问题 我想格式化用于输入信用卡号的UITextField ,以便它仅允许输入数字并自动插入空格,以便数字的格式如下: XXXX XXXX XXXX XXXX 我怎样才能做到这一点? 回答1 如果您使用的是Swift,请阅读我的Swift 4答案端口,并改用它。 如果您使用的是Objective-C ... 首先,在您的UITextFieldDelegate ,添加这些实例变量... NSString *previousTextFieldContent; UITextRange *previousSelection; ...以及这些方法: // Version 1.3 // Source and explanation: http://stackoverflow.com/a/19161529/1709587 -(void)reformatAsCardNumber:(UITextField *)textField { // In order to make the cursor end up positioned correctly, we need to // explicitly reposition it after we inject spaces into the text. // targetCursorPosition keeps track of where the
  • 如何学好python
    python语言的特点: 脚本语言和高级语言的区别,在于脚本语言可以直接执行,高级语言需要先编译,后执行 python是一门解释性,编译性,互动性的面向对象高层次脚本语言 c语言是面向过程的高级语言,java,c++是面向对象的高级语言 机器语言,全部由二进制码组成, 汇编语言,由简单的单词, python编码 #-*-coding:utf-8-*- #coding:utf-8 #coding=utf-8 python解释器路径 #!c:/python/python36 python注释 #单行注释 多行注释 3个'或者3个" , ''' """ python缩进 同一行语句换行怎么换 在换行语句时加上 \ python必须保持严格的缩进格式 标识符,关键字 1.标识符可以由数字,字母,下划线组成 2.标识符不能由数字开头 3.以单下划线开头的标识符 代表不能直接访问的类属性 4.以双下划线开头的标识符,代表类的私有成员 5.标识符字母区分大小写 6.禁止使用python中的保留字 import keyword keyword.kwlist #查看python中所有的关键字 keyword.iskwyword("try") #查看是否为关键字 创建变量 在python中,变量不需要提前声明,可以直接赋值使用 数据类型 数字 number 没有整型和小数之分,字符串 string
  • Axure RP 9 高级交互功能
    目录 条件逻辑 建筑条件 满足"全部"或"任何"条件语句 具有多个条件情况的事件(IF 和其他) 创建多个 IF/ELSE 链 数学、函数和表达式 写入表达式 数字和数学 基本运算符 高级数字和数学函数 字符串(文本) 小部件属性 页面、窗口和光标 日期和时间 布尔 条件逻辑 条件逻辑是一个规则系统,可用于指定在Web 浏览器中构建的交互时间。例如,您可以规定,只有当用户填写表单中的所有必需字段时,单击按钮才能将用户前进到原型中的下一页。 将条件视为与它们的交互具有 if/then关系:如果满足条件,则将执行交互。 您可以创建一切,从仅影响单个交互的简单条件到控制原型每个区域的复杂分支逻辑。 建筑条件 要向交互添加条件逻辑,请将鼠标悬停在事件名称上,然后单击"启用案例"。在显示的条件生成器对话框中,单击"添加逻辑"。 在条件生成器中,可以使用每行中的字段配置一个或多个条件语句。条件语句以某种方式比较两个值以生成真结果或假结果: One value — How it compares to — A second value 例如,您可以验证文本字段是否已填充具有以下条件的特定值: text on widget — Text Field — equals — text — your value here 当目标文本字段的输入文本等于最右侧字段中提供的值时,此条件语句将计算为 true。
  • 如何将复选框绑定到列表视图(how to bind a checkbox to a listview)
    问题
  • Python操作redis详解
    redis学习 https://www.jianshu.com/p/2639549bedc8 https://blog.csdn.net/BIT_SKY/article/details/51201369 1、redis连接 redis提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py。 redis连接实例是线程安全的,可以直接将redis连接实例设置为一个全局变量,直接使用。如果需要另一个Redis实例(or Redis数据库)时,就需要重新创建redis连接实例来获取一个新的连接。同理,python的redis没有实现select命令。 安装redis pip install redis 连接redis,加上decode_responses=True,写入的键值对中的value为str类型,不加这个参数写入的则为字节类型。 import redis # 导入redis模块,通过python操作redis 也可以直接在redis主机的服务端操作缓存数据库 r = redis.Redis(host='localhost', port=6379, decode_responses=True) #
  • 使用Freetype高效渲染文字
    使用 Freetype 高效渲染文字 FreeType是一个可以免费使用的字体渲染软件库。它是用C语言编写的,设计小巧、高效、高度可定制和可移植,同时能够产生大多数矢量和位图字体格式的高质量输出(字形图像)。 Freetype 使用 头文件 /* 包含各种宏声明,稍后将用于#include适当的公共FreeType 2头文件 */ #include <ft2build.h> /* 包含freetype2 API头文件。 应该使用宏 FT_FREETYPE_H 来实现这一点,如下面的例子所示。*/ #include FT_FREETYPE_H #include FT_BITMAP_H #include FT_OUTLINE_H Library 初始化 要初始化FreeType库,需要创建一个名为library的FT_Library类型的变量,并调用函数FT_Init_FreeType。 FT_Library library; error = FT_Init_FreeType( &library ); if ( error ) { ... an error occurred during library initialization ... } 创建一个 FreeType 2 库的新实例,并为其设置句柄库 在库中加载 FreeType 支持的每个模块,例如 TrueType、Type
  • 如何通过其值而不是位置设置微调器默认值?(How to set Spinner Default by its Value instead of Position?)
    问题 我在数据库中有 1-50 条记录。 我正在使用游标获取这些数据,并使用 Simple Cursor Adapter 将这些值设置为 Spinner。 现在我需要的是我想设置一个值,比如第 39 个值作为默认值。 但不是通过它的位置,我想通过它的值来设置。 我知道如何通过其位置设置微调器默认值 spinner.setSelection(39) 将微调器设置为该值。 但是我不知道通过数据库中的值(文本)设置微调器默认值。 我知道数据库中的值。 例如,“书籍”是微调器中的值之一。 我需要将微调器默认设置为书籍。 有没有可能的方法来做到这一点? 回答1 如果您是通过设定微调数值arraylist或array您可以通过使用值的索引设置Spinner的选择。 String myString = "some value"; //the value you want the position for ArrayAdapter myAdap = (ArrayAdapter) mySpinner.getAdapter(); //cast to an ArrayAdapter int spinnerPosition = myAdap.getPosition(myString); //set the default according to value spinner.setSelection
  • Android IME,在EditText中设置光标位置(Android IME, set cursor position in EditText)
    问题
  • vscode代码索引_vscode自定义代码提示:用户代码片段
    先来看看效果 配置好之后输入配置的代码段词头,就会有提示出现👇 入口 点击 vscode 左下角 设置⚙️ 图标,点击用户代码片段 选择代码片段文件 点击用户代码片段后会展示所有语言的列表,博客使用 markdown 语法,这里选择 markdown.json ,点击进入 json 文件 正文 进入配置文件后,官方提供了一个 Example ,去掉注释后,可以看到代码长这样: "Print to console": { "prefix": "log", "body": [ "console.log('$1');", "$2" ], "description": "Log output to console" } Print to console 是代码段的名称,当没有设置 description 时,会作为代码提示的标题显示 prefix 顾名思义就是触发代码提示的词头,在代码区输入设置好的词头,就会有代码提示 body 里的就是代码段,支持多行显示和单行显示,字符串数组形式,每个元素代表一行,也可以用 \n 换行 description 是代码的说明,配置后会替代代码段的名称显示 :::tip body 里面可以使用特殊的结构来控制插入光标和文字: ::: 使用 $ 加数字可以通过制表符控制光标移动,例如 $1 、 $2 、 $3...,数字越大越靠后,生成代码块后
  • GAE 数据存储游标是否永久且持久?(Are GAE Datastore cursors permanent and durable?)
    问题 说com.google.appengine.api.datastore.Cursor只是将索引位置存储到 GAE Datastore 索引中是否正确? 游标耐用吗? 也就是说,我可以永久存储一个游标并一次又一次地重用它,确定它是否指向索引中的第 5000 个位置,这就是它永远指向的位置吗? 如果索引收缩到少于 5000 个条目怎么办? 使用这个游标会导致错误还是什么都不返回? 对于较大的索引(比如 100,000 个或更多条目),我是否可以首先为每个 5000 的倍数位置(比如)获取游标,存储它们,然后使用这组游标以 Map/Reduce 方式做一些工作? 我实际上使用的是 Objectify 而不是直接使用 DS,但是 AFAIK 这不会影响 Cursors vis-a-vis Indexes 的属性。 回答1 游标仅在进行的原始查询的上下文中才有意义。 它们不完全是索引位置/偏移量。 从游标和数据更新: 游标的位置定义为最后一个结果返回后在结果列表中的位置。 游标不是列表中的相对位置(它不是偏移量); 它是 Cloud Datastore 在开始索引扫描结果时可以跳转到的标记。 如果在使用游标之间查询结果发生更改,则查询只会注意到游标之后结果中发生的更改。 如果查询的游标位置之前出现新结果,则在获取游标之后的结果时不会返回该结果。 同样
  • 在PL / SQL中将逗号分隔的字符串转换为数组(Convert comma separated string to array in PL/SQL)
    问题 如何将逗号分隔的字符串转换为数组? 我有输入' 1,2,3' ,我需要将其转换为数组。 回答1 Oracle提供了内置函数DBMS_UTILITY.COMMA_TO_TABLE。 不幸的是,这不适用于数字: SQL> declare 2 l_input varchar2(4000) := '1,2,3'; 3 l_count binary_integer; 4 l_array dbms_utility.lname_array; 5 begin 6 dbms_utility.comma_to_table 7 ( list => l_input 8 , tablen => l_count 9 , tab => l_array 10 ); 11 dbms_output.put_line(l_count); 12 for i in 1 .. l_count 13 loop 14 dbms_output.put_line 15 ( 'Element ' || to_char(i) || 16 ' of array contains: ' || 17 l_array(i) 18 ); 19 end loop; 20 end; 21 / declare * ERROR at line 1: ORA-00931: missing identifier ORA-06512: at "SYS
  • Cursor goes to end after setting text to UITextField inside shouldChangeCharactersIn
    I have text label which has phone number in it. I mask the phone number when user is typing so that in shouldChangeCharactersIn function; I get user input (string) Add that input to text which is already written in UITextField Mask text and set it to UITextField Return false My question is that after I set text of UITextfield (delete or add new character UITextField, cursor moves to the end but I want it to stay in the same position. (By meaning same position, I mean same when I don't implement shouldChangeCharactersIn function) How can I do that? Thank you. func textField(_ textField
  • 是否有任何方法可以解决常见的SQLite问题?(Are there any methods that assist with resolving common SQLite issues?)
    问题 通常,相对简单的错误会导致问题,而这些错误往往是由于对SQLite的误解而加重的。 例如:- 找不到表和列,因为通常假定每次创建DBHelper实例或每次运行App时都运行DBHelper的onCreate方法( SQLiteOpenHelper类的子类)。 (注意! onCreate仅在首次创建数据库时自动调用,然后仅在尝试使用SQLiteDatabase getReadableDatabase或getWriteableDatabse方法之一时自动调用,如果更改数据库结构/架构,则有3种简单的方法将onCreate强制为运行,a)清除应用程序的数据,b)卸载应用程序,或b)如果onUpgrade方法调用onCreate方法(在删除表之后),然后增加数据库版本号)。 插入/更新不起作用,但不会失败。 对于SQLite的新手来说,也很生气/令人生畏,无法立即查看数据库包含的内容。 那么,有什么通用的工具可以帮助您吗? 笔记! 这旨在成为共享知识问答风格的问题。 回答1 以下是一些新手可能会发现有用的常用实用程序,它们被设计为非特定的并且可以在任何数据库/表上使用。 当前有以下潜在有用的方法:- getAllRowsFromTable检索所有行的Cursor。 logCursorColumns将游标中的列写入日志。 logCursorData将游标数据和列写入日志。 笔记!
  • 源码阅读(33):Java中线程安全的Queue、Deque结构——ArrayBlockingQueue(3)
    (接上文《源码阅读(32):Java中线程安全的Queue、Deque结构——ArrayBlockingQueue(2)》) 2.3.3、迭代器中主要方法分析 一旦Itr迭代器完成初始化,就可以开始使用了。而使用迭代器最常见的方法就是使用hasNext()方法和next()方法进行配合。另外从JDK 1.8+开始,还可以使用Lambda表达式进行表达,最后ArrayBlockingQueue队列集合的迭代器还支持remove()方法的使用。 2.3.3.1、hasNext()方法和next()方法 我们先行来介绍hasNext()方法和next()方法,这也是最常见的迭代器使用方法,从JDK 1.8开始,java.util.Iterator定义了另一种方法void forEachRemaining(Consumer<? super E> action),其默认实现也是基于hasNext()方法和next()方法的配合使用,如下所示: public interface Iterator<E> { // ...... default void forEachRemaining(Consumer<? super E> action) { Objects.requireNonNull(action); // hasNext()方法和next()方法进行配合,构成了默认的处理方式 while
  • 是否可以将鼠标光标放在元素后面,或者鼠标光标是否有 z-index?(Is it possible to put the mouse cursor behind an element or does the mouse cursor have an z-index?)
    问题 当鼠标悬停在某个元素上时,我想用自定义图像替换鼠标光标。 我通过首先关闭鼠标光标来做到这一点 cursor: none; 当它悬停在元素上时。 然后我读出悬停元素上的光标位置,并将图形的 css 位置设置为稍微偏移的光标位置,以便鼠标光标不在图形上方但仍在悬停区域上方。 我在这里做了一个小提琴:http://jsfiddle.net/TimG/6XeWK/ 现在它安静地工作。 问题只是当您非常快速地移动鼠标时,鼠标光标离开悬停区域并“滑过”图像当然这使得无法确定鼠标相对于悬停区域的位置(非常快地移动到左下角)在黑色悬停区域)。 我可以通过将图形设置为更难滑出悬停区域 display: none; 在更改图像的 css 位置之前和更改后将其设置为 display: block; 再次。 不幸的是,它并不能完全防止这个问题。 所以:有什么办法可以防止这种情况发生吗? 或者有没有办法将鼠标光标放在手后面? 有点像为鼠标光标设置 z-index(我的猜测是,这是不可能的,因为它没有 DOM 元素)? 感谢您的帮助。 回答1 问题 有没有办法将鼠标光标放在手后面? 当您快速移动鼠标时看到鼠标指针的原因是您偶尔会在指针上看到鼠标指针,因此.hoverbox:hover样式未应用。 在你的mousemove事件绑定添加CSS样式cursor: none还的指针,你不应该看到