【问题标题】:SwiftUI, 'Fatal error: Unexpectedly found nil while unwrapping an Optional value' messageSwiftUI,“致命错误:在展开可选值时意外发现 nil”消息
【发布时间】:2021-06-26 13:15:42
【问题描述】:

我运行代码,然后收到以下错误消息: 致命错误:在展开可选值时意外发现 nil

  1. 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")!
    }
}
  1. 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(""))
        
    }
}
  1. 创建视图
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())
    }
}
  1. 应用文件
@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


    【解决方案1】:

    删除以下行,它不是要创建视图的地方,而是您在不注入环境对象的情况下创建它的地方:

    struct ContentView: View {
        // MARK: - PROPERTY
        let createpage = CreateView()    // << this one !!
    
    ...
    

    【讨论】:

    • 感谢您的回答!我把那条线放在那里是因为在 ContentView -> 导航链接中,目的地是 CreateView,没有那条线我得到一个错误.. 有没有其他方法可以使导航链接目的地到另一个没有这样的线的视图?跨度>
    • 哦,没关系,对不起。没有那行代码它可以正常工作。谢谢!
    【解决方案2】:

    如果您要通过environmentObject 传递数据,那么您需要接收页面上的数据。您正在发送它但没有收到它。如果您想收到它,请在您的视图中将其添加到您的 body 上方。

    @EnvironmentObject var appData: AppData

    另外你使用NavigationView 错误,应该只有一个导航栏所以删除那些其他导航栏并将此代码用于你的App.swift

     @main  // *here I get Fatal Error msg*
    struct WFT_demo2App: App {
        var body: some Scene {
            WindowGroup {    // *here I get Fatal Error msg*
             NavigationView {
                ContentView(text: .constant(""))
             }
                    .environmentObject(AppData())    // *here I get Fatal Error msg*
            }
        }
    }
    

    再次:删除除此代码 sn-p 中的导航栏以外的所有其他导航栏。而且您必须使用此方法传递一次数据。但是注意您仍然需要在依赖其数据的每个视图上声明 `@EnvironmentObject var appData: AppData

    【讨论】:

    • 感谢您的回答!我按照您的建议编辑了代码,但在相同的代码行上仍然出现相同的错误。我认为问题出在'self.showTitle = UserDefaults.standard.string(forKey:“TitleInput”)! AppData 文件中的这一行..
    • 您尝试过 Asperis 的建议吗
    猜你喜欢
    • 2020-09-19
    • 2021-04-10
    • 2016-01-26
    • 2016-02-29
    • 2016-01-08
    相关资源
    最近更新 更多