Я только что завершил порт SwiftUI простого приложения Android, которое я сделал (спасибо всем здесь за помощь), но оно не будет отображаться на холсте. Он встроен в симулятор и на моем телефоне хорошо, хотя.
Это как-то связано с вызовом функции выбора базы данных в .onAppear, так как когда я комментирую эту часть кода, она работает нормально.
import SwiftUI
import AVFoundation
struct SoundPageView: View {
var category: String
var pageTitle: String
var buttonRows = [ButtonData]()
@State var btns: [[String]] = [[]]
@State var translation: String = "Bahasa Indonesia"
@State var gotValues: Bool = false
var btn1: String = "First Button"
var btn2: String = "Second Button"
var btn3: String = "Third Button"
var btn4: String = "Fourth Button"
var btn5: String = "Fifth Button"
var btn6: String = "Sixth Button"
var btn7: String = "Seventh Button"
var btn8: String = "Eighth Button"
var btn9: String = "Ninth Button"
var btn10: String = "Tenth Button"
var btn11: String = "Eleventh Button"
var btn12: String = "Twelfth Button"
var btn13: String = "Thirteenth Button"
var btn14: String = "Fourteenth Button"
var btn15: String = "Fifteenth Button"
var btn16: String = "Sixteenth Button"
var body: some View {
VStack {
Text("\(self.translation)")
// .italic()
.frame(maxWidth: .infinity)
.multilineTextAlignment(.center)
.frame(height: 50)
.padding(.horizontal, 4)
HStack(spacing:0) {
VStack {
Button(action: {
playSound(sound: "\(self.category)_audio1", type: "mp3")
self.translation = self.btns[1][1]
}) {
if(gotValues==true) {
Text("\(self.btns[1][0])")
} else {
Text("\(self.btn1)")
}
}
.buttonStyle(SoundButton())
Button(action: {
playSound(sound: "\(self.category)_audio3", type: "mp3")
self.translation = self.btns[3][1]
}) {
if(gotValues==true) {
Text("\(self.btns[3][0])")
} else {
Text("\(self.btn3)")
}
}
.buttonStyle(SoundButton())
Button(action: {
playSound(sound: "\(self.category)_audio5", type: "mp3")
self.translation = self.btns[5][1]
}) {
if(gotValues==true) {
Text("\(self.btns[5][0])")
} else {
Text("\(self.btn5)")
}
}
.buttonStyle(SoundButton())
Button(action: {
playSound(sound: "\(self.category)_audio7", type: "mp3")
self.translation = self.btns[7][1]
}) {
if(gotValues==true) {
Text("\(self.btns[7][0])")
} else {
Text("\(self.btn7)")
}
}
.buttonStyle(SoundButton())
Button(action: {
playSound(sound: "\(self.category)_audio9", type: "mp3")
self.translation = self.btns[9][1]
}) { if(gotValues==true) {
Text("\(self.btns[9][0])")
} else {
Text("\(self.btn9)")
}
}
.buttonStyle(SoundButton())
Button(action: {
playSound(sound: "\(self.category)_audio11", type: "mp3")
self.translation = self.btns[11][1]
}) {
if(gotValues==true) {
Text("\(self.btns[11][0])")
} else {
Text("\(self.btn11)")
}
}
.buttonStyle(SoundButton())
Button(action: {
playSound(sound: "\(self.category)_audio13", type: "mp3")
self.translation = self.btns[13][1]
}) {
if(gotValues==true) {
Text("\(self.btns[13][0])")
} else {
Text("\(self.btn13)")
}
}
.buttonStyle(SoundButton())
Button(action: {
playSound(sound: "\(self.category)_audio15", type: "mp3")
self.translation = self.btns[15][1]
}) {
if(gotValues==true) {
Text("\(self.btns[15][0])")
} else {
Text("\(self.btn15)")
}
}
.buttonStyle(SoundButton())
}
VStack {
Button(action: {
playSound(sound: "\(self.category)_audio2", type: "mp3")
self.translation = self.btns[2][1]
}) {
if(gotValues==true) {
Text("\(self.btns[2][0])")
} else {
Text("\(self.btn2)")
}
}
.buttonStyle(SoundButton())
Button(action: {
playSound(sound: "\(self.category)_audio4", type: "mp3")
self.translation = self.btns[4][1]
}) {
if(gotValues==true) {
Text("\(self.btns[4][0])")
} else {
Text("\(self.btn4)")
}
}
.buttonStyle(SoundButton())
Button(action: {
playSound(sound: "\(self.category)_audio6", type: "mp3")
self.translation = self.btns[6][1]
}) {
if(gotValues==true) {
Text("\(self.btns[6][0])")
} else {
Text("\(self.btn6)")
}
}
.buttonStyle(SoundButton())
Button(action: {
playSound(sound: "\(self.category)_audio8", type: "mp3")
self.translation = self.btns[8][1]
}) {
if(gotValues==true) {
Text("\(self.btns[8][0])")
} else {
Text("\(self.btn8)")
}
}
.buttonStyle(SoundButton())
Button(action: {
playSound(sound: "\(self.category)_audio10", type: "mp3")
self.translation = self.btns[10][1]
}) {
if(gotValues==true) {
Text("\(self.btns[10][0])")
} else {
Text("\(self.btn10)")
}
}
.buttonStyle(SoundButton())
Button(action: {
playSound(sound: "\(self.category)_audio12", type: "mp3")
self.translation = self.btns[12][1]
}) {
if(gotValues==true) {
Text("\(self.btns[12][0])")
} else {
Text("\(self.btn12)")
}
}
.buttonStyle(SoundButton())
Button(action: {
playSound(sound: "\(self.category)_audio14", type: "mp3")
self.translation = self.btns[14][1]
}) {
if(gotValues==true) {
Text("\(self.btns[14][0])")
} else {
Text("\(self.btn14)")
}
}
.buttonStyle(SoundButton())
Button(action: {
playSound(sound: "\(self.category)_audio16", type: "mp3")
self.translation = self.btns[16][1]
}) {
if(gotValues==true) {
Text("\(self.btns[16][0])")
} else {
Text("\(self.btn16)")
}
}
.buttonStyle(SoundButton())
}
}
}
.onAppear {
let buttonRows = DatabaseHelper().queryDatabase(category: self.category)
for each in buttonRows {
self.btns.append([each.english,each.indonesian])
}
self.gotValues = true
}
.navigationBarTitle(Text(self.pageTitle), displayMode: .inline)
}
}
struct SoundPageView_Previews: PreviewProvider {
static var previews: some View {
SoundPageView(category: "", pageTitle: "")
}
}
struct SoundButton: ButtonStyle {
func makeBody(configuration: Self.Configuration) -> some View {
configuration.label
.font(.custom("arial", size: 20))
.padding(.horizontal, 4).minimumScaleFactor(0.9)
.foregroundColor(Color.black)
.multilineTextAlignment(.center)
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(configuration.isPressed ? LinearGradient(gradient: Gradient(colors: [Color("DarkestGreen"), Color("LightGreen")]), startPoint: .top, endPoint: .bottom):LinearGradient(gradient: Gradient(colors: [Color("DarkGreen"), Color("LightGreen")]), startPoint: .top, endPoint: .bottom))
.cornerRadius(10)
.shadow(radius: 3.0)
.overlay(
RoundedRectangle(cornerRadius: 10)
.stroke(Color.white, lineWidth:2))
.padding(2)
.scaleEffect(configuration.isPressed ? 0.975 : 1.0)
}
}
Вот сообщение об ошибке I ' Я попадаю на холст.
![enter image description here](https://i.stack.imgur.com/vtqRI.png)
В идеале я хотел бы вызвать функцию базы данных перед .onAppear, но я не уверен, куда ее поместить. Когда я создаю init (), возникает много ошибок. Как я уже сказал, все в приложении работает точно так, как должно, я просто не хочу, чтобы ошибка cra sh была причиной отклонения моего приложения Apple. Это просто бесплатное приложение для моих учеников и очень простое.