在SwiftUI中突出显示文本的特定部分

问题描述 投票:1回答:4

你好,我是Swift的新手,正在为我的项目使用SwiftUI,我在其中下载了一些天气数据并将其显示在ContentView()中。

如果文本中包含某些特定单词,我想突出显示该文本的某些部分,但是我不知道如何开始。

在ContentView()中,我试图设置一个函数来接收从Web下载的字符串并返回一个字符串。我认为这是错误的,因为SwiftUI根本不对Text应用修饰符。

例如,在我的ContentView()中,我希望雷雨这个词具有.bold()修饰符:

struct ContentView: View {
  let testo : String = "There is a thunderstorm in the area"

  var body: some View {
    Text(highlight(str: testo))
  }

  func highlight(str: String) -> String {
    let textToSearch = "thunderstorm"
    var result = ""

    if str.contains(textToSearch) {
      let index = str.startIndex
      result = String( str[index])
    }

    return result
  }

}
swift string search text swiftui
4个回答
1
投票

如果只需要简单的单词样式,那么这里是可能的解决方案。

使用Xcode 11.4 / iOS 13.4测试

demo

struct ContentView: View {
    let testo : String = "There is a thunderstorm in the area. Added some testing long text to demo that wrapping works correctly!"

    var body: some View {
        hilightedText(str: testo)
            .multilineTextAlignment(.leading)
    }

    func hilightedText(str: String) -> Text {
        let textToSearch = "thunderstorm"
        var result: Text!

        for word in str.split(separator: " ") {
            var text = Text(word)
            if word == textToSearch {
                text = text.bold()
            }
            result = (result == nil ? text : result + Text(" ") + text)
        }
        return result
    }
}

1
投票

您可以连接多个文本视图。

import SwiftUI
import PlaygroundSupport

struct ContentView: View {
  var body: some View{
    let testo : String = "There is a thunderstorm in the area"
    let stringArray = testo.components(separatedBy: " ")
    let stringToTextView = stringArray.reduce(Text(""), {
      if $1 == "thunderstorm" {
        return $0 + Text($1).bold() + Text(" ")
      } else {
        return $0 + Text($1) + Text(" ")
      }

    })
    return stringToTextView
  }
}

PlaygroundPage.current.setLiveView(ContentView())


0
投票

我不会为您解决这个问题,但是我可以为您指明正确的方向。它只会使您成为更好的程序员。

[使用Xcode打开新的Playground,然后粘贴以下代码段:

import Foundation

let str = "There is a thunderstorm in the area"

let array = str.components(separatedBy: " ")

print(array)

输出:[“那里”,“是”,“一个”,“雷暴”,“在”,“该”,“区域”]

((将字符串分割成单词)

现在,编写一个函数,接受您要搜索的单词的输入,如果您找到的单词不存在,则返回一个布尔值。

func findWordInStr(str: String) -> Bool {
  // Give this a try 
}

0
投票

iOS 13,Swift5。本文中介绍了一种通用解决方案。使用它,您可以在任何地方突出显示任何文本,唯一的收获就是长度不能超过64个字符,因为它使用按位掩码。

https://medium.com/@marklucking/an-interesting-challenge-with-swiftui-9ebb26e77376

enter image description here

这是本文中的基本代码。

ForEach((0 ..< letter.count), id: \.self) { column in
      Text(letter[column])
        .foregroundColor(colorCode(gate: Int(self.gate), no: column) ? Color.black: Color.red)
        .font(Fonts.futuraCondensedMedium(size: fontSize))

    }

和这个用来掩盖文字的人...

func colorCode(gate:Int, no:Int) -> Bool {

 let bgr = String(gate, radix:2).pad(with: "0", toLength: 16)
 let bcr = String(no, radix:2).pad(with: "0", toLength: 16)
 let binaryColumn = 1 << no - 1

 let value = UInt64(gate) & UInt64(binaryColumn)
 let vr = String(value, radix:2).pad(with: "0", toLength: 16)

 print("bg ",bgr," bc ",bcr,vr)
 return value > 0 ? true:false
}
© www.soinside.com 2019 - 2024. All rights reserved.