我有一行代码将Text的背景设置为通过查找字符串的前三个字母来获取的Image。由于某种原因,它无法运行,并不断给我上面的错误。关于如何解决此问题的任何想法?
有许多图像需要设置为多个不同文本段的背景。我相信我可以通过使用字符串的前缀来实现正确的主意,但是似乎Xcode遇到了困难/不会运行它。
可以肯定的是,这一特定行给我带来了问题,但希望得到一些反馈。
.background(Image(colorOption.prefix(3)).resizable())
import SwiftUI
struct ColorView: View {
// @ObservedObject var survey = Survey()
@ObservedObject var api = ColorAPIRequest(survey: DataStore.instance.currentSurvey!)
@State var showingConfirmation = true
@State var showingColorView = false
@State var tempSelection = ""
@EnvironmentObject var survey: Survey
//@EnvironmentObject var api: APIRequest
var colorOptionsGrid: [[String]] {
var result: [[String]] = [[]]
let optionsPerRow = 4
api.colorOptions.dropFirst().forEach { colorOption in
if result.last!.count == optionsPerRow { result.append([]) }
result[result.count - 1].append(colorOption)
}
return result
}
var body: some View {
VStack {
Text("Select Tape Color")
.font(.system(size:70))
.bold()
.padding(.top, 20)
NavigationLink("", destination: LengthView(), isActive: $showingColorView)
HStack {
List {
ForEach(colorOptionsGrid, id: \.self) { colorOptionRow in
HStack {
ForEach(colorOptionRow, id: \.self) { colorOption in
Button(action: {
// self.survey.length = lengthOption
self.tempSelection = colorOption
self.showingConfirmation = false
}
) {
ZStack {
Color.clear
Text(colorOption.prefix(3))
.font(.title)
.foregroundColor(self.tempSelection == colorOption ? Color.white : Color.black)
.frame(width: 200, height: 100)
.background(Image(colorOption.prefix(3)).resizable())
//Image(colorOption.prefix(3)).resizable()
}
}.listRowBackground(self.tempSelection == colorOption ? Color.pink : Color.white)
.multilineTextAlignment(.center)
}
}
}
}.buttonStyle(PlainButtonStyle())
}
Button(action: {
self.survey.color = self.tempSelection
self.showingColorView = true
self.showingConfirmation = true
}) {
Text("Press to confirm \(tempSelection)")
.bold()
.padding(50)
.background(Color.pink)
.foregroundColor(.white)
.font(.system(size:40))
.cornerRadius(90)
}.isHidden(showingConfirmation)
.padding(.bottom, 50)
}
}
}
答案 0 :(得分:0)
当编译器告诉您分解表达式时,实际上给出了相当不错的建议。最简单的方法是将背景图像提取到一个单独的函数中,如下所示:
func backgroundImage(for colorOption: String) -> some View {
Image(String(colorOption.prefix(3))).resizable()
}
,然后替换对
的调用.background(Image(colorOption.prefix(3)).resizable())
与
.background(self.backgroundImage(for: colorOption))
还要注意,我将colorOption.prefix(3)
包装在String
构造函数中,仅仅是因为.prefix(_:)
返回了Substring
,但是Image(_:)
构造函数需要一个String。