【问题标题】:How can you process a newline escape sequence "\n" in a SwiftUI TextField as a line break?如何将 SwiftUI TextField 中的换行符转义序列“\n”处理为换行符?
【发布时间】:2021-10-25 17:29:35
【问题描述】:

我正在尝试创建一个简单的文本字段,允许输入带有换行符序列并输出带有换行符的文本。

struct Foo: View {
  @State private var inputText: String

  var body: some View {
    VStack {
      TextField("foo", text: $inputText)
      Text(inputText)
    }
  }
}

换行序列在Text("hello\nworld") 中可以正常工作,但如果与 TextField 一起使用,则只会显示“\n”而不是换行符。我也尝试访问绑定字符串的 WrappedValue 无济于事。我在这里错过了什么?


编辑:我对多行输入不感兴趣。我对像“hello\nworld”这样的单行输入感兴趣。但是,当我通过 TextField 在绑定变量中捕获“hello\nworld”时,我没有看到我期望的输出,即 hello 然后是换行符然后是 world。相反,我看到的字符串与输入的完全一样:hello\nworld.

【问题讨论】:

  • 您是说用户实际上会键入“hello\nworld”(包括“\”和“n”),然后您想将其转换为换行符吗?
  • 没错。如果你只有 Text("hello\nworld"),那通常会发生这种情况。
  • 澄清一下:“hello”和“world”在不同的行中,正如您所期望的那样。

标签: swiftui escaping newline textfield


【解决方案1】:

听起来您想要获取用户输入的字符串“Hello\nworld”(它会读作“Hello\nworld”的转义字符串)并将文字(非转义)“\n”替换为换行符。

这样可以:

struct ContentView: View {
    @State private var inputText: String = ""
    
    var body: some View {
        VStack {
            TextField("foo", text: $inputText)
            Text(inputText.replacingOccurrences(of: "\\n", with: "\n"))
        }
    }
}

【讨论】:

  • 这正是我想要的,谢谢。虽然我不完全理解为什么这里需要额外的反斜杠 - 或者更确切地说,为什么“\n”通常只是作为换行符处理时在这里被解读为文字。
  • 当用户输入“\n”时,系统认为是两个字符——“\”和“n”。这与我们在代码中使用\n 时不同,后者是告诉编译器输入换行符的简写。通过使用第二个反斜杠,我们告诉编译器不要将后面的斜杠视为换行符的一部分,而应仅将其视为常规的“\”字符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-22
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 2013-06-24
  • 2016-11-03
相关资源
最近更新 更多