core-data - 如何在 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
}
解决方案
推荐阅读
- sql - postgresSQL 父/子的递归查询
- java - 如何在 android studio 中为蓝牙耳机类运行隐藏的 API?
- java - JAVA 在 JMenuItem[] 构造函数中声明未初始化的 JMenuItem() 项
- anypoint-studio - 将 Mulesoft 运行时版本更新到 4.2.1 时出错
- spring-boot - SCDF 自定义 spring 云流源应用程序不会将生成的消息写入 Kafka 主题
- android - 应用程序启动时android picasso不起作用
- docker - 如何管理 docker 容器的 SELinux 上下文?
- sql - SQLite 别名 (AS) 不在同一个查询中工作
- spring - 如何在反序列化之前使用 java reactor webclient 打印 responseBody
- javascript - 当我使用 ' ; '而不是' && ',输出发生变化,我需要帮助理解它