草庐IT

ios - 带有 @tags 的 UITextView 和视觉效果背后的隐藏信息

coder 2024-01-12 原文

我正在尝试实现与 Facebook 的帖子编辑器相同的功能,您可以在其中 @tag 人。 我能够使用 NSMutableAttributedString 和 NSRegularExpression 轻松实现着色。

用户发布文本后,我需要发送更多信息。用户可以从自动提示弹出窗口中选择人(已经实现,获取用户的姓名和数据)。只要我想保留@people 格式,一切都正常,但我做不到。 我遇到的问题是我想向用户显示@someone,但我需要在后台保留更多信息,例如此人的 userId 以便稍后将其传递给后端。

看看 Facebook 是怎么做到的——他们甚至不使用 @ 符号,他们只是为名字添加一些背景颜色。

例如:

Here I tag @myfriend and something else

这应该会导致信息@tag 从 10 开始,长度为 9,userId=100,所以我可以给它上色并传递给后端关于用户选择了谁的信息。 我还想拥有的一些附加功能是当用户从标签中删除一个字母时删除整个标签。

我有点纠结于什么是最好的方法。

想法 1:保留 2 个 NSString,一个具有标记格式的链接,其中包含存在于后台的所有数据,第二个经过修饰以显示给用户。

问题:在用户编辑时管理 2 个 NSString 真的很痛苦,所有的 NSRanges 对他们来说都是不同的,例如从文本中删除标签会很困难。我试图让两者保持同步,但遇到了很多问题并放弃了。

想法 2: 当用户选择带有偏移量、长度的人到@tag 时,保留对标签的引用的 NSArray,并显示用户生成的 NSFormattedString,它来自于没有任何特殊标记的源文本的组合,这信息。

问题:当用户编辑文本时,范围可能会改变,例如,如果用户在我的例子中删除或添加一些字母到我的@myfriend 之前,我将不得不更新所有标签的偏移量,这可能会导致一些问题。如果用户选择一个文本范围并将其删除,则更复杂的情况是,偏移量必须更新超过 1。

这两个听起来都过于复杂,我知道问题并不容易,但也许有人对此类功能有一些经验,或者对如何以某种合理的方式解决它有一些想法。

最佳答案

我的问题的答案是第 2 个想法。

我在 UITextField 中保留了一个文本 + 单独的所有标签及其位置和长度的数组 - 这是来自自动完成 View 。

期间

- (BOOL) textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text

我更新所有在将要更改的范围之后的标签,方法是将它们的位置增加 [text length] - range.length

我还有一些改进,当用户从标签中删除单个字母时,它会完全消失。在此功能中完成的所有工作都非常顺利。

根据那些生成的标记位置,我装饰了一个文本。

关于ios - 带有 @tags 的 UITextView 和视觉效果背后的隐藏信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26537912/

有关ios - 带有 @tags 的 UITextView 和视觉效果背后的隐藏信息的更多相关文章

  1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  4. 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返回它复制的字节数,但是当我还没有下

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

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

  6. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  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 - 带有 Zeus 的 RSpec 3.1,我应该在 spec_helper 中要求 'rspec/rails' 吗? - 2

    使用rspec-rails3.0+,测试设置分为spec_helper和rails_helper我注意到生成的spec_helper不需要'rspec/rails'。这会导致zeus崩溃:spec_helper.rb:5:in`':undefinedmethod`configure'forRSpec:Module(NoMethodError)对thisissue最常见的回应是需要'rspec/rails'。但这是否会破坏仅使用spec_helper拆分rails规范和PORO规范的全部目的?或者这无关紧要,因为Zeus无论如何都会预加载Rails?我应该在我的spec_helper中做

  9. Ruby:如何使用带有散列的 'send' 方法调用方法? - 2

    假设我有一个类A,里面有一些方法。假设stringmethodName是这些方法之一,我已经知道我想给它什么参数。它们在散列中{'param1'=>value1,'param2'=>value2}所以我有:params={'param1'=>value1,'param2'=>value2}a=A.new()a.send(methodName,value1,value2)#callmethodnamewithbothparams我希望能够通过传递我的哈希以某种方式调用该方法。这可能吗? 最佳答案 确保methodName是一个符号,而

  10. ruby-on-rails - 带有 Pry 的 Rails 控制台 - 2

    当我进入Rails控制台时,我已将pry设置为加载代替irb。我找不到该页面或不记得如何将其恢复为默认行为,因为它似乎干扰了我的Rubymine调试器。有什么建议吗? 最佳答案 我刚发现问题,pry-railsgem。忘记了它的目的是让“railsconsole”打开pry。 关于ruby-on-rails-带有Pry的Rails控制台,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/question

随机推荐