NSString:不替换之前的文本,使用UITextView

7

如何在不替换之前的文本的情况下向UITextView添加文本?

到目前为止,我有一个UITextView和一个UIButton,可以将文本添加到UITextView中,但是我希望每次单击按钮时文本字段都会追加更多文本,而不是完全删除并替换它。

4个回答

12

以下是在iOS开发中克服障碍的几种方法:

  1. 查看您正在尝试操作的特定类的文档。在这种情况下,可以通过Xcode或在线找到 UITextView 的文档。

  2. 在您的代码中,Command-Click UITextView 或任何其他对象,它将带您进入该类的头文件。头文件将列出每个公共方法和属性。

  3. 查看您现有的代码。我假设您知道如何设置 UITextView 的文本,因为您有一个添加文本到 UITextView 的按钮。99%的时间,您会发现任何 setter (mutator) 方法都会有一个相应的 getter (accessor) 方法。在这种情况下,UITextView 有一个名为 setText: 的方法和一个名为 text 的匹配方法。

最后,NSString 有一个称为 stringWithFormat: 的便利方法,您可以使用它来连接(联接)两个字符串,其中包括其他非常有用的功能。 %@ 是字符串的格式说明符。例如,要组合两个字符串 stringOne 和 stringTwo,您可以执行以下操作:

NSString *string = [NSString stringWithFormat:@"%@ %@", stringOne, stringTwo];

我将让您自行想出如何使用上述信息来结合 NSString 的 stringWithFormat: 和 UITextField 的 text 和 setText: 以实现您想要完成的内容。


编辑: 提问者无法想出如何利用上面的信息,因此下面提供了完整的代码示例。

假设您已经合成了一个属性(可能是 IBOutlet)UITextView,您已经初始化了它并称为 myTextView。还假设我们当前在调用方法的范围内(如果您正在使用 IB,则为您的 IBAction),当您点击 UIButton 时,该方法将被调用。

[myTextView setText:[NSString stringWithFormat:@"%@ %@", myTextView.text, @"this is some new text"]];
解释: myTextView.text获取了UITextView中现有的文本,您可以简单地在这之后添加任何字符串。因此,如果文本视图最初被填充了文本"Hello world",然后您点击了三次按钮,您将得到以下进展:
初始字符串:@"Hello world" 第一次点击:"Hello world this is some new text" 第二次点击:"Hello world this is some new text this is some new text" 第三次点击:"Hello world this is some new text this is some new text text this is some new text"

但我希望它能够在需要时容纳无限数量的字符串。 - nfoggia
它可以仅使用我上面概述的方法实现。 - Jack Lawrence
1
你所需要的一切都在那里,你只需要尝试而不是依赖于Stack Overflow作为支撑。如果必要的话,我会编辑问题并使其更容易理解。 - Jack Lawrence
2
@nfoggia,如果你已经知道所有这些,你就不会问这么简单的问题了。我并不反对简单的问题,但是你的语气和缺乏对杰克周到回答的尊重让我怀疑你是否应该在这里。 - damon
@damon 谢谢 :) 我已经更新了问题,这样他就可以懒一点了。;) - Jack Lawrence
1
抱歉之前爆发了...我今天过得不太好。哈哈。非常感谢,我实际上已经想出来了,我正要来道歉,你们就把那个放上去了。谢谢大家。 - nfoggia

2
更高效的追加文本方法是在末尾使用replace():
extension UITextInput {
  func append(_ string : String) {
    let endOfDocument = self.endOfDocument
    if let atEnd = self.textRange(from: endOfDocument, to: endOfDocument) {
      self.replace(atEnd, withText: string)
    }
  }
}

2
如果您只是在添加文本,您可能会发现这样更简单:
myTextView.text = [myTextView stringByAppendingString:@"suffix\n"];

我在UITextView insert text in the textview text上找到了这个。很遗憾,我没有找到一种直接添加文本而不需要完全替换UITextView中的文本的方法。令我困扰的是,所需的工作量与现有字符串和后缀的总长度成正比,而不仅仅是后缀。


我觉得你忘了一个 .text[myTextView setText:[myTextView stringByAppendingString:@"suffix\n"]]; 应该改为 [myTextView setText:[myTextView.text stringByAppendingString:@"suffix\n"]]; 否则你在一个 UITextView 上调用了一个 NSString 的方法 ;) ... 顺便说一下,myTextView.text = [myTextView.text stringByAppendingString:@"suffix\n"]; 更简洁一些 ;) - HAS
谢谢,@HAS。我从我的项目中复制时削减得太多了。 - Randall Cook
你的答案仍需要根据@HAS的评论更正为myTextView.text = [myTextView.text stringByAppendingString:@"suffix\n"]; - Reefwing

1

@杰克·劳伦斯:你的回答并没有完全涵盖问题。

当每秒调用时,下面的示例将无法整洁地滚动到底部:

self.consoleView.text = [NSString stringWithFormat:@"%@%@%@", self.consoleView.text, data, @"\n"];
[self.consoleView scrollRangeToVisible:NSMakeRange(self.consoleView.text.length, 0)];

这是由于setText每次替换原始文本,从而重置相关的contentOffsets等内容所导致的。
这在iOS 7之前是可能的,但自从iOS 7以来,似乎无法防止setText表现出跳跃行为。在这种情况下,对于TextViews来说,追加似乎不是一个选项?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接