首页 > 解决方案 > 如何在 NavigationLink 中使用 .onTapGesture 正确创建和获取核心数据实体

问题描述

我仍在学习 SwiftUI 和 CoreData,我正在开发一个虚拟项目,基本上我正在尝试在注册视图上创建一个用户实体,然后在单击注册按钮时,我想依次创建和获取用户数据以便在我的 ContentView 中显示它。我想出了一种方法,但我确信这是不正确的方法,因为当我创建一个新对象时,它还会创建一堆 NULL 数据,我怀疑这是因为我没有给出UI 有足够的时间在视图中创建、获取和显示数据。这是我正在使用的代码...

任何帮助将不胜感激!

    NavigationLink(
        destination: getDestination(from: admin),
        isActive: self.$isSignUpValid){
        Text("Sign Up")
            .onTapGesture {
                createUserObject(company: self.company, name: self.name, username: self.username, password: self.password, photo: self.inputImage, admin: self.admin)
                selectedUser = fetchUserDetails(withUser: username)
                self.selectedImageArray = imagesFromCoreData(object: selectedUser!.photo!)!
                isSignUpValid = true
            }
    }
    


        //Sets appropriate View destination based on value of Admin variable.
            func getDestination(from adminValue: Bool) -> AnyView {
                
                    if adminValue == false {
                        return AnyView(ContentView(selectedUser: self.selectedUser ?? User(context: moc), selectedImageArray: self.selectedImageArray))
                    }
                    else {
                        return AnyView(AdminView(selectedUser: self.selectedUser ?? User(context: moc), selectedImageArray: self.selectedImageArray))
                    }
                }


func createUserObject(company: String, name: String, username: String, password: String, photo: UIImage?, admin: Bool){
    
    //Produces a Data object from an Array of Images.
    func coreDataObjectFromImages(image: UIImage) -> Data? {
        let dataArray = NSMutableArray()
        
        if let data = image.pngData() {
            dataArray.add(data)
        }
        return try? NSKeyedArchiver.archivedData(withRootObject: dataArray, requiringSecureCoding: true)
    }
    
    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    
    let newUser = User(context: context)
    newUser.id = UUID()
    newUser.admin = admin
    newUser.company = company
    newUser.name = name
    newUser.username = username
    newUser.password = password
    newUser.photo = coreDataObjectFromImages(image: (photo ?? UIImage(systemName:"person.circle")!))
    
    do {
        try context.save()
        print("New User Created")
    } catch {
        print(error)
    }
}



func fetchUserDetails(withUser user: String) -> User? {
    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    let fetchRequest = NSFetchRequest<User>(entityName: "User")
    fetchRequest.fetchLimit = 1
    fetchRequest.predicate = NSPredicate(format: "username == %@", user)
    
    do {
        let fetchUser = try context.fetch(fetchRequest)
        return fetchUser.first
    } catch let fetchError {
        print("Failed to fetch: \(fetchError)")
    }
    return nil
}

标签: core-dataswiftui

解决方案


推荐阅读