【发布时间】:2021-06-26 13:15:42
【问题描述】:
我运行代码,然后收到以下错误消息: 致命错误:在展开可选值时意外发现 nil
- AppData 文件
struct Shortcut {
var title: String
var option: String
}
struct ShortcutViewModel: Identifiable {
var id = UUID()
var shortcut: Shortcut
var title: String {
return shortcut.title.capitalized
}
var option: String {
return shortcut.option
}
}
class AppData: ObservableObject {
@Published var userData: [ShortcutViewModel]
@Published var showTitle: String {
didSet {
UserDefaults.standard.set(showTitle, forKey: "TitleInput")
}
}
@Published var showOption: String {
didSet {
UserDefaults.standard.set(showOption, forKey: "OptionInput")
}
}
init() {
userData = [
ShortcutViewModel(shortcut: Shortcut(title: "What for Dinner?", option: "Chinese")),
ShortcutViewModel(shortcut: Shortcut(title: "What for Lunch?", option: "Pasta")),
ShortcutViewModel(shortcut: Shortcut(title: "What for Breakfast?", option: "Toast"))
]
self.showTitle = UserDefaults.standard.string(forKey: "TitleInput")! // *here I get Fatal Error msg*
self.showOption = UserDefaults.standard.string(forKey: "OptionInput")!
}
}
- ContentView 文件
struct ContentView: View {
// MARK: - PROPERTY
let createpage = CreateView()
// MARK: - BODY
var body: some View {
ZStack {
VStack {
NavigationBarView()
NavigationView{
ScrollView{
HStack {
NavigationLink("+ create a shortcut", destination: CreateView())
.font(.title3)
.foregroundColor(.blue)
.padding()
.frame(width: 200, height: 60)
.background(
RoundedRectangle(cornerRadius: 10,
style: .continuous)
.fill(
Color(red:0.2, green: 0.45, blue: 1.0, opacity: 0.3)))
Spacer()
} //: HStack - link to create page
//.frame(minWidth: 0, maxWidth: .infinity, maxHeight: 120)
.padding()
} //: ScrollView
.navigationTitle("All Shortcuts")
} //: NavigationView
} //: VStack
.ignoresSafeArea(.all, edges: .all)
} //: ZStack
.ignoresSafeArea(.all, edges: .top)
} //: var Body
}
// MARK: - PREVIEW
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView(text: .constant(""))
}
}
- 创建视图
struct CreateView: View {
// MARK: - PROPERTY
@Environment(\.presentationMode) var presentationMode
@EnvironmentObject var appData: AppData
@State var titleInput2 = ""
@State var optionInput2 = ""
// MARK: - BODY
var body: some View {
ZStack {
VStack {
NavigationView{
ScrollView{
HStack {
TextField("what is the title?", text: $titleInput2)
.font(.title2)
.foregroundColor(.white)
.padding()
.frame(width: 320, height: 80)
.background(
RoundedRectangle(
cornerRadius: 20,
style: .continuous)
.fill(
Color(red:0.2, green: 0.45, blue: 1.0, opacity: 0.3)))
.padding()
} //: HStack - Textfield - title
.padding()
HStack (spacing: 10) {
TextField("options", text: $optionInput2)
.font(.body)
.foregroundColor(.white)
.padding()
.frame(width: 120, height: 60, alignment: .leading)
.background(
RoundedRectangle(
cornerRadius: 10,
style: .continuous)
.fill(
Color(red: 1.0, green: 0.2, blue: 0.2, opacity: 0.3)))
.padding()
} //: HStack - Textfield - option
.padding()
Button(action: {
self.appData.showTitle = titleInput2
self.appData.showOption = optionInput2
presentationMode.wrappedValue.dismiss()
}, label: {
Text("Save")
.padding()
.background(
Circle()
.fill(
Color(red: 0.25, green: 0.1, blue: 0.6, opacity: 0.25))
.frame(width: 120, height: 120))
}) //: Button - save
.padding(.top, 150)
} //: Scroll View
.navigationTitle("Create a Shortcut")
}//: Navigation View
} //: VStack
.ignoresSafeArea(.all, edges: .all)
} //: ZStack
.ignoresSafeArea(.all, edges: .all)
} //: Body
}
struct CreateView_Previews: PreviewProvider {
static var previews: some View {
CreateView().environmentObject(AppData())
}
}
- 应用文件
@main // *here I get Fatal Error msg*
struct WFT_demo2App: App {
var body: some Scene {
WindowGroup { // *here I get Fatal Error msg*
ContentView(text: .constant(""))
.environmentObject(AppData()) // *here I get Fatal Error msg*
}
}
}
当我运行代码时(当我模拟它时),我在上面标记的几行中收到相同的致命错误消息。我想我错过了一些重要的东西。另外,在 3. CreateView 文件中,可以使用 @State var titleInput2 = "" 和 @State var optionInput2 = "" 吗? 谢谢你的建议!
【问题讨论】:
标签: swiftui