SwiftUI를 사용하여 텍스트 필드를 핵심 데이터에 저장하는 방법

redearz

에 입력 할 때 핵심 데이터와 함께 값을 저장 TextField하고보기에 들어갈 때 다시 표시 되는 작업을 완료 할 수 없습니다 . 가능합니까?

나는 저장 name하고 surname. 이를 위해 ProfileData데이터 모델을 만들었지 만 관련 정보를 찾을 수 없습니다. 제대로 작동하는 방법에 대해 설명합니다.

코드 아래에서 찾으십시오.

import SwiftUI
import CoreData

struct ProfileView: View {
    @State private var name: String = ""
    @State private var surname: String = ""
    @Environment(\.managedObjectContext) var managedObjectContext
    @FetchRequest(
        entity: ProfileData.entity(),
        sortDescriptors: [
            NSSortDescriptor(keyPath: \ProfileData.name, ascending: true),
            NSSortDescriptor(keyPath: \ProfileData.surname, ascending: true),

        ]
    ) var profile: FetchedResults<ProfileData>
    @EnvironmentObject var profile1: ProfileData

    var body: some View {
        VStack {
            HStack {
                VStack {
                    HStack {
                        Text("Meno:")
                            .font(.headline)
                            .padding()
                        TextField("", text: $name, onCommit: {
                        self.profile1.name = self.name
                        try? self.managedObjectContext.save()})
                    .onAppear {
                        self.name = self.profile.name != nil ? "\(self.profile.name!)" : "Zadajte meno" //here I get error Value of type 'FetchedResults<ProfileData>' has no member 'name'
                    }
                    .onDisappear {
                        self.profile1.name = self.name
                        try? self.managedObjectContext.save()
                    }
                        }   .padding(.leading, 37)
                    }
                    HStack {
                        Text("Priezvisko:")
                            .font(.headline)
                            .padding()
                        TextField("Zadajte priezvisko", text: $surname)
                    }
                }
            }
        }
        .navigationBarTitle(Text("Profil"))
    }
}

내 ProfileData + CoreClassData.swift는 다음과 같습니다.

import Foundation
import CoreData

@objc(ProfileData)
public class ProfileData: NSManagedObject {

}

그리고 여기 내 ProfileData + CoreDataProperties.swifft가 있습니다.

//
//  ProfileData+CoreDataProperties.swift
//  UcmMap
//
//  Created by Jakub Adamec on 06/01/2020.
//  Copyright © 2020 Jakub Adamec. All rights reserved.
//
//

import Foundation
import CoreData


extension ProfileData {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<ProfileData> {
        return NSFetchRequest<ProfileData>(entityName: "ProfileData")
    }

    @NSManaged public var name: String?
    @NSManaged public var surname: String?

}
Aspid

다음은 전체 코드입니다.

import SwiftUI
import CoreData

@objc(ProfileData)
public class ProfileData: NSManagedObject, Identifiable {
    public var id = UUID()
}


extension ProfileData {


    @NSManaged public var name: String?
    public var wrappedName: String{
        get{name ?? "NoName"}
        set{name = newValue}
    }
    @NSManaged public var surname: String?
    public var wrappedSurname: String{
        get{surname ?? "NoSurname"}
        set{surname = newValue}
    }
}

struct ProfileView: View {
    @State private var name: String = ""
    @State private var surname: String = ""
    @Environment(\.managedObjectContext) var moc: NSManagedObjectContext // it will need you to add new examples of youre entities and save all changes
    @FetchRequest(
        entity: ProfileData.entity(),
        sortDescriptors: [
            NSSortDescriptor(keyPath: \ProfileData.name, ascending: true),
            NSSortDescriptor(keyPath: \ProfileData.surname, ascending: true),

        ]
    ) var profileList: FetchedResults<ProfileData>
    //fetchRequest is a list of all objects off type ProfileData - saved and unsaved

    var body: some View {
        NavigationView{

            List{
                ForEach(profileList){profile in
                    NavigationLink(destination: profileUpdateView(profile: profile)){
                        Text("\(profile.wrappedName) \(profile.wrappedSurname) ")
                    }
                }
                HStack{
                    Image(systemName: "plus.circle.fill")
                        .foregroundColor(.green)
                        .imageScale(.large)
                    Button("add a new profile"){
                        let newProfile = ProfileData(context: self.moc)
                        newProfile.wrappedName = "Name"
                        newProfile.wrappedSurname = "Surname"
                        }

                }
             }

                .navigationBarTitle(Text("Profile"))
                .navigationBarItems(trailing: Button("save"){
                if self.moc.hasChanges{
                    do{try self.moc.save()}
                    catch{print("Cant save changes: \(error)")}
                }
            })

        }
    }
}
struct profileUpdateView: View {
    @ObservedObject var profile: ProfileData
    var body: some View{
        VStack {
              HStack {
                  Text("Meno:")
                      .font(.headline)
                      .padding()
                TextField("Zadajte meno", text: $profile.wrappedName)
              }
              HStack {
                  Text("Priezvisko:")
                      .font(.headline)
                      .padding()
                    TextField("Zadajte priezvisko", text: $profile.wrappedSurname)
              }
          }
    }
}
struct ProfileView_Previews: PreviewProvider {
    static var previews: some View {
        let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
        let newProfile = ProfileData(context: context)
        newProfile.wrappedName = "Name"
        newProfile.wrappedSurname = "Surname"
        return ProfileView().environment(\.managedObjectContext, context)
    }
}

몇 가지 사항에 주목하십시오.

  1. FetchRequest정의한 유형의 엔티티 목록을 반환합니다. 하나의 항목, 여러 항목이있을 수도 있고 없을 수도 있습니다.
  2. 무언가를 가져 오면 ForEach결과를 보여주는 루프가 필요합니다 (대부분).
  3. 그렇게하기 위해 나는 id당신에게 엔티티를 추가했습니다 . CoreData에 연결되어 있지 않고 FetchRequest새로운 결과를 얻을 때마다 id가 변경되지만 괜찮습니다. 그것의 유일한 목적은 ForEach루프의 어느 부분이 정확히 객체와 연결되어 있는지 알려주는 것입니다 . 따라서 ForEach변경하고 업데이트를 표시 할 수 있습니다.
  4. 변경하는 것을 잊지 마세요 codegen에 데이터 모델에서 개체의 속성을 manual/none. 이렇게하려면 DataModel like를 열고 엔티티를 선택하고 데이터 모델 검사기로 이동합니다 (화면 오른쪽). 그렇지 않은 경우 컴파일러는 컴파일 자체에서 해당 파일을 생성하고이 클래스는 두 번 정의됩니다.
  5. 유형의 새 개체를 만들려면 MOC를 사용해야합니다. NSManagedObject유형의 개체를 만드는 유일한 방법 입니다.
  6. TextField에 BindableObject를 넣을 수 있습니다. 그 목적으로 @State를 사용하려고했지만 필요하지 않습니다. 다음과 같이 일반 객체 속성을 수정할 수 있습니다 TextField("Zadajte meno", text: $profile.wrappedName). $기호는이 속성을 래핑하는 것 @Binding입니다. 즉, 내부의 모든 변경 사항 View이 즉시이 개체로 변환됩니다.
  7. @NSManaged대부분은 String?과 같은 선택적 유형이 있기 때문에 속성을 넣을 수 없습니다. wrappedName뷰에서 간단히 사용하기 위해 계산 된 속성 만들었습니다 .
  8. @ObservedObject업데이트보기에서 래퍼를 사용합니다 . 비슷 @State하지만 수업 용입니다. View이 개체가 변경 될 때 즉시 업데이트하고 싶을 때 사용합니다 . 또한 Binding. 클래스는 ObservableObject프로토콜 요구 사항을 충족해야 하지만 NSManagedObject이미 충족 해야하므로 걱정할 필요가 없습니다. 모든 @NSManaged속성이 이미 @Published있습니다.
  9. CoreData를 사용하더라도 Canvas를 사용하는 방법이 있습니다. 에서 컨텍스트를 가져 와서 AppDelegate테스트 엔터티를 만듭니다. 그러나 저장된 변경 사항은 미리보기에 추가됩니다.
  10. 마지막으로 모든 변경 사항을 moc.save(). 예외가 발생할 수 있으므로 try-catch. 그리고 실제로 저장되지 않은 변경 사항이 있는지 확인하는 것이 좋습니다.

SwiftUI 학습에 행운을 빕니다. SwiftUI 및 CoreData 사용에 대한 정보가별로 없습니다. hackingwithswift 에서 확인해보세요 . 유용한 정보가 많이 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

SwiftUI에서 핵심 텍스트를 사용하는 방법

분류에서Dev

핵심 데이터에 여러 레코드를 저장하는 방법

분류에서Dev

iOS의 핵심 데이터에 JSON 데이터를 저장하는 방법

분류에서Dev

핵심 데이터 모델 (속성)에 데이터를 저장하는 방법

분류에서Dev

핵심 데이터를 SwiftUI TextField에 전달하는 방법

분류에서Dev

마법사를 사용하여 엔티티를 핵심 데이터에 저장

분류에서Dev

ForEach SwiftUI에서 핵심 데이터 관계를 사용하는 방법

분류에서Dev

collectionviewcell의 이미지를 핵심 데이터에 저장하는 방법

분류에서Dev

다른 View Controller에서 레이블 텍스트를 변경하고 핵심 데이터로 저장하는 방법

분류에서Dev

Objective C를 사용하여 iOS의 핵심 데이터에서 데이터를 필터링하는 방법

분류에서Dev

SwiftUI보기에서 핵심 데이터 정보를 업데이트하는 방법

분류에서Dev

프로젝트에 핵심 데이터를 추가하고 JSON 서비스에서 가져온 데이터를 저장하는 방법

분류에서Dev

Swift 3의 핵심 데이터를 사용하여 여러 부서에 대해 하나의 레코드를 저장하는 방법

분류에서Dev

마이 인 패드에 저장된 데이터 (핵심 데이터 모델로 저장)를 여는 방법

분류에서Dev

핵심 데이터를 업데이트하고 사용자가 저장 한 데이터를 유지하는 방법은 무엇입니까?

분류에서Dev

xcode / ios : 이미지를 디스크에 저장하고 핵심 데이터에 이름을 저장하는 방법

분류에서Dev

다중 스레드에서 NSMangedObjectContext를 사용하는 방법의 핵심 데이터

분류에서Dev

사용자 관심사를 데이터베이스에 저장하는 방법

분류에서Dev

엔터티를 다른 엔터티 핵심 데이터에 신속하게 저장하는 방법

분류에서Dev

".h"파일 클래스가 UITableViewController가 아닌 UIViewController 일 때 핵심 데이터 엔티티에 저장된 데이터를 UITableView에 표시하는 방법

분류에서Dev

Laravel 5.4를 사용하여 여러 양식 필드를 데이터베이스에 저장하는 방법

분류에서Dev

SwiftUI에서 필터링 된 핵심 데이터를 합산하는 방법은 무엇입니까?

분류에서Dev

핵심 데이터 Swift 3에서 PersistentStore (for : url)를 사용하는 방법

분류에서Dev

UIImagePickerController-핵심 데이터에 이미지를 저장하는 방법은 무엇입니까?

분류에서Dev

asp.net 핵심 서비스에서 * 키워드를 사용하는 방법.

분류에서Dev

핵심 텍스트를 사용하여 글리프 이름 얻기

분류에서Dev

Python : 핵심 문구를 사용하여 문자열에서 텍스트 추출

분류에서Dev

Python : 핵심 문구를 사용하여 문자열에서 텍스트 추출

분류에서Dev

핵심 텍스트를 사용하여 마지막 문자의 사각형을 얻는 방법

Related 관련 기사

  1. 1

    SwiftUI에서 핵심 텍스트를 사용하는 방법

  2. 2

    핵심 데이터에 여러 레코드를 저장하는 방법

  3. 3

    iOS의 핵심 데이터에 JSON 데이터를 저장하는 방법

  4. 4

    핵심 데이터 모델 (속성)에 데이터를 저장하는 방법

  5. 5

    핵심 데이터를 SwiftUI TextField에 전달하는 방법

  6. 6

    마법사를 사용하여 엔티티를 핵심 데이터에 저장

  7. 7

    ForEach SwiftUI에서 핵심 데이터 관계를 사용하는 방법

  8. 8

    collectionviewcell의 이미지를 핵심 데이터에 저장하는 방법

  9. 9

    다른 View Controller에서 레이블 텍스트를 변경하고 핵심 데이터로 저장하는 방법

  10. 10

    Objective C를 사용하여 iOS의 핵심 데이터에서 데이터를 필터링하는 방법

  11. 11

    SwiftUI보기에서 핵심 데이터 정보를 업데이트하는 방법

  12. 12

    프로젝트에 핵심 데이터를 추가하고 JSON 서비스에서 가져온 데이터를 저장하는 방법

  13. 13

    Swift 3의 핵심 데이터를 사용하여 여러 부서에 대해 하나의 레코드를 저장하는 방법

  14. 14

    마이 인 패드에 저장된 데이터 (핵심 데이터 모델로 저장)를 여는 방법

  15. 15

    핵심 데이터를 업데이트하고 사용자가 저장 한 데이터를 유지하는 방법은 무엇입니까?

  16. 16

    xcode / ios : 이미지를 디스크에 저장하고 핵심 데이터에 이름을 저장하는 방법

  17. 17

    다중 스레드에서 NSMangedObjectContext를 사용하는 방법의 핵심 데이터

  18. 18

    사용자 관심사를 데이터베이스에 저장하는 방법

  19. 19

    엔터티를 다른 엔터티 핵심 데이터에 신속하게 저장하는 방법

  20. 20

    ".h"파일 클래스가 UITableViewController가 아닌 UIViewController 일 때 핵심 데이터 엔티티에 저장된 데이터를 UITableView에 표시하는 방법

  21. 21

    Laravel 5.4를 사용하여 여러 양식 필드를 데이터베이스에 저장하는 방법

  22. 22

    SwiftUI에서 필터링 된 핵심 데이터를 합산하는 방법은 무엇입니까?

  23. 23

    핵심 데이터 Swift 3에서 PersistentStore (for : url)를 사용하는 방법

  24. 24

    UIImagePickerController-핵심 데이터에 이미지를 저장하는 방법은 무엇입니까?

  25. 25

    asp.net 핵심 서비스에서 * 키워드를 사용하는 방법.

  26. 26

    핵심 텍스트를 사용하여 글리프 이름 얻기

  27. 27

    Python : 핵심 문구를 사용하여 문자열에서 텍스트 추출

  28. 28

    Python : 핵심 문구를 사용하여 문자열에서 텍스트 추출

  29. 29

    핵심 텍스트를 사용하여 마지막 문자의 사각형을 얻는 방법

뜨겁다태그

보관