带语法突出显示的UITextView

时间:2010-09-04 13:49:44

标签: iphone objective-c cocoa-touch uitextview

如何在 iPhone <{1}}上UITextView进行语法突出显示,特别是语法突出显示(和检测Objective-C < /强>

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

  • NSAttributedString。现在可在iOS 3.2及更高版本中使用。但是我如何将NSAttributedString放入UITextView?
  • UIWebView。在用户完成编辑时叠加它并使用CSS样式表为文本着色。但是我如何在UIWebView中执行此操作,为其提供文本然后对其进行着色?

5 个答案:

答案 0 :(得分:74)

更新:自iOS 7和 TextKit 以来,语法突出显示变得简单。 Look no further than here介绍(由我)。


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

  • UITextView纯文本,无(公共)方式。但可编辑。没有机会改变任何东西,没有机会获得几何等。在内部使用Web视图。每个段落都是<div>,由编辑引擎更改。您可以在那里更改DOm,但这是所有私有API。所有私人,因此没有选择。
  • UIWebView html ,因此可以设置样式,嵌入图片等等。我猜(不看其中)这就是前面提到的Three 20 UI使用的内容。问题:无法编辑。没有(公共)方式。您可以在没有私有API的情况下获取选择,访问DOM等等,并且令人头疼。编辑将像UITextView一样工作,但需要一个全新的头痛水平。仍然:私人。
  • CoreText框架:从iOS 3.2开始,这是一个非常好的渲染引擎。但就是这样。可以直接布局和渲染NSAttributesString。但是,没有用户交互。没有文字选择,没有文字输入,没有拼写检查,没有替换,没有高亮,没有不,不,没有。只是渲染。还有很多工作要在带有长文本的旧设备上快速完成。
  • UITextInput协议:允许与键盘交互并抓取文本输入。还具有基本文本替换功能。问题:仅输入文本,记录错误。没有文字选择等(见上文)。

所以我们在这里。两个缺乏中心功能的全功能组件和两个缺少缺失链接的部分解决方案。以下是我能提出的所有可行方法:

  • 让用户编辑UITextView无样式,并显示UIWebView中设置样式的内容。对于后者,你可以使用Three20的东西。
  • CoreTextUITextInput之间构建缺失的链接。这包括但不限于文本选择,突出显示,背景颜色,文本存储和文本选择。管理,效率,拼写检查等。其中一些是由系统框架提供的,但仍需要大量的集成。
  • 提交错误并等待一个不错的公共API(我的个人方法)。
  • 说服Apple再次允许私有API并弄乱UItextView的DOM。

Omni Group采用了第二种方法并创建了可编辑的文本视图。您可以在OmniUI框架中找到它。但是,这种实现远非完美。 (至少是几个月前我上次检查的时候)。他们努力尝试但仍无法在用户交互中达到Apples的完美。 Apple必须投入至少几个人年才能完成与文本选择和编辑的UI交互。在国内没有什么可做的,甚至对于作为全方位群体的公司来说也是如此。

所有这一切都有一个有趣的方面:​​iWork。 Apple声称不使用任何私有API。但文本选择与操作系统中的相同。所以他们必须将框架源复制到应用程序中。非常诚实的方法;)

答案 1 :(得分:12)

从iOS 5开始,您可以使用UIWebView并在其中的div上设置contenteditable="true"。这使得UIWebView打开键盘并允许用户直接将文本输入到DOM中。然后,您可以编写一个执行语法突出显示的webapp。您可以使用自定义URL与cocoa应用程序进行通信。

我唯一的问题是你似乎没有拼写检查。

答案 2 :(得分:2)

JTextView是支持UITextView文本存储的NSAttributedString替代品。它允许显示富文本但不完整。

答案 3 :(得分:1)

如果有人仍在为此寻找完整的解决方案,我知道有两个提供此解决方案的库:

  • Highlightr:用于语法高亮的Swift库,支持数百种语言,但使用JS作为后端。不过,它对于实时编辑来说足够快。 (免责声明:我是这个图书馆的创建者。)
  • SyntaxKitSam Soffes的原生解决方案,但在开发的早期阶段。将来应该支持任何TextMate语法。这应该是图书馆足够成熟时的方法。

答案 4 :(得分:0)

我对语法检测知之甚少,但是如果你想在同一个UITextView中有多个样式,那么Three 20 UI是你应该看的东西

以下是与您有关的另一个问题:What is the best way to implement syntax highlighting of source code in Cocoa。我不确定它是Mac还是iPhone,但我认为如果你将它和Three20结合起来,那么你就可以拥有自己的iPhone。祝你好运