如何在UITextView中突出显示语法,特别是在iPhone上为Objective-C添加syntax highlighting(和detection)?

我对如何做到这一点的一些 idea :

  • NSAttributedString.现已在iOS 3.2及更高版本中提供.但我如何在UITextView中输入NSAttributedString呢?
  • UIWebView.当用户完成编辑并使用CSS样式表为文本上色时,将其覆盖.但是,我该如何在一个UIWebView中做到这一点,给它文本,然后给它着色?

推荐答案

UPDATE:自iOS 7和TextKit以来,语法高亮显示变得非常简单.Look no further than here美元(由我介绍).


假设您想要一个可编辑的组件,就没有太多希望了.快速概述,以确保涵盖所有内容:

  • 仅限UITextView:plain text,无(公共)通道.但是editable.没有机会修改任何东西,没有机会获得几何图形等.在内部使用web视图.每个段落都是<div>,由编辑引擎修改.您可以在其中更改DOm,但这都是私有API.都是私有的,因此别无 Select .
  • UIWebView:html,所以它可以设计样式,有嵌入的图像,等等.我猜(不看它)这就是前面提到的三个20 UI使用的.问题是:cannot be edited.没有(公开的)办法来解决这个问题.如果没有私有API和很多麻烦,你就无法获得 Select 、访问DOM等等.编辑工作与UITextView类似,但需要一个全新的头痛级别.还是:私有的.
  • CoreText框架:因为iOS 3.2是一个非常好的rendering引擎.但就是这样.可以直接布局和渲染NSAttributesString.但是,没有用户交互.没有文本 Select ,没有文本输入,没有拼写判断,没有替换,没有高亮显示,没有渲染.要在有长文本的旧设备上快速运行,需要做大量工作.
  • UITextInput协议:允许与键盘交互并获取text input.还具有基本的文本替换功能.问题:仅文本输入,文档记录不完整.无文本 Select 等(见上文).

我们到了.两个功能齐全的组件缺少中心功能,两个部分解决方案缺少缺失的环节.以下是我能想到的所有可行方法:

  • 让用户编辑一个UITextView样式的文件,并以UIWebView样式显示内容.对于后者,你可以使用Three20.
  • CoreTextUITextInput之间建立缺失的链接.这包括但不限于文本 Select 、突出显示、背景色、文本存储和;管理、效率、拼写判断等.其中一些由系统框架提供,但仍需要大量集成.
  • 提交一个bug并等待一个好的公共API(我个人的方法).
  • 说服苹果再次允许私有API,并 destruct UItextView年代的DOM.

Omni Group采用了第二种方法,创建了一个可编辑文本视图.你可以在OmniUI框架中找到它.然而,这种实现还远远不够完美.(至少是几个月前我上次判断的时候).他们尽了最大努力,但仍然未能在用户交互方面达到完美.苹果肯定已经投入了至少几年的人力,只在用户界面上进行文本 Select 和编辑.在国内什么也做不了,就连像omni group这样的公司似乎也是如此.

这一切都有一个有趣的方面:我工作.苹果声称没有在其中使用任何私有API.但文本 Select 与操作系统中的文本 Select 完全相同.所以他们一定是将框架源代码复制到了应用程序中.非常诚实的方法;)

Objective-c相关问答推荐

如何限制 UITextField 中的特殊字符(点和下划线除外)?

在 Objective-C 中实现纯虚方法

让 iPhone sleeping

Objective-C 中的正式协议和非正式协议有什么区别?

当前时间是 HH:MM:SS am/pm 格式吗?

在 Objective-C 中在 iPhone 上使用 HTTP POST 和 GET 的教程

测试应用程序是否确实从 UILocalNotification 变为活动状态

不区分大小写的核心数据 CONTAINS 或 BEGINS WITH 约束

如何调整 UIModalPresentationFormSheet 的大小?

将 NSArray 转换为 NSDictionary

使用正则表达式在 Xcode 中查找/替换

奇怪的错误 NSAssert

UITabBar 未在 ios 7 中显示所选项目图像

iOS6:supportedInterfaceOrientations 不起作用(被调用但界面仍然旋转)

关闭一次后如何返回允许推送通知对话框?

隐藏 NSTableView 标头?

如何在今天午夜获取 NSDate 对象?

将数据传回前一个视图控制器

使用 cocoaLumberjack 将日志(log)文件存储在哪里

UITableViewCell中的文本居中对齐问题