你好,我是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
}
}
如果只需要简单的单词样式,那么这里是可能的解决方案。
使用Xcode 11.4 / iOS 13.4测试
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
}
}
您可以连接多个文本视图。
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())
我不会为您解决这个问题,但是我可以为您指明正确的方向。它只会使您成为更好的程序员。
[使用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
}
iOS 13,Swift5。本文中介绍了一种通用解决方案。使用它,您可以在任何地方突出显示任何文本,唯一的收获就是长度不能超过64个字符,因为它使用按位掩码。
https://medium.com/@marklucking/an-interesting-challenge-with-swiftui-9ebb26e77376
这是本文中的基本代码。
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
}