변수가 변경될 때 SwiftUI의 View가 다시 로드되도록 합니다.

12703 단어 SwiftUI
SwiftUI의 뷰는 자동으로 다시 그려지며 일반적으로 특정 함수를 호출하고 다시 로드할 수 없습니다. 모니터링할 변수를 SwiftUI 뷰에 알리려면 다음 변수 유형을 사용할 수 있습니다.
  • @State
  • @Binding
  • @Published

  • 이 기사에서는 이러한 변수 유형을 소개합니다.

    @State


    @State 변수를 변경하면 해당 뷰가 자동으로 업데이트됩니다.
    struct ContentView: View {
    
        @State var textContent = "Loading..."
    
        var body: some View {
    
            Text(textContent)
                .padding()
                .onAppear(perform: {
                    Timer.scheduledTimer(withTimeInterval: 2, repeats: false) { _ in
                        self.textContent = "Hello world!"
                    }
                })
    
        }
    
    }
    

    @Binding



    뷰 오브젝트가 많은 서브뷰로 분할되는 경우, 서브뷰에는 @Binding 속성을 정의할 수 있고, 기본 뷰에는 @State 변수를 정의할 수 있습니다.
    struct ContentView_SubView: View {
    
        @Binding private var textContent: String
    
        init(textContent: Binding<String>) {
            _textContent = textContent
        }
    
        var body: some View {
    
            Text(textContent)
                .padding()
    
        }
    
    }
    
    struct ContentView: View {
    
        @State var textContent = "Loading..."
    
        var body: some View {
    
            ContentView_SubView(textContent: $textContent)
                .onAppear(perform: {
                    Timer.scheduledTimer(withTimeInterval: 2, repeats: false) { _ in
                        self.textContent = "Hello world!"
                    }
                })
    
        }
    
    }
    

    @ObservedObject and @Published



    예를 들어 SwiftUI의 뷰에 사용자의 위치를 ​​표시하려면 도우미 클래스 LocationHelper를 작성할 수 있습니다.
    LocationHelperCLLocationManager에서 위치를 검색하고 변수 userCoordinate에 좌표를 저장합니다.
    ObservableObject 프로토콜을 준수하기 위해 LocationHelper를 설정하고 속성 래퍼에 @Published를 갖도록 userCoordinate를 설정할 수 있습니다.
    class LocationManager: NSObject, ObservableObject, CLLocationManagerDelegate {
    
        @Published var userLocation: CLLocation?
    
        let locationManager = CLLocationManager()
    
        init(accuracy: CLLocationAccuracy) {
            super.init()
            self.locationManager.delegate = self
            self.locationManager.desiredAccuracy = accuracy
            self.locationManager.requestAlwaysAuthorization()
            self.locationManager.startUpdatingLocation()
        }
    
        func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
            guard let location = locations.last else { return }
            self.userLocation = location
        }
    
        func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
            print(error.localizedDescription)
        }
    
    }
    

    SwiftUI 뷰에서 LocationManager@ObservedObject를 추가 할 수 있습니다.
    @ObservedObject var location: LocationManager
    init() {
        self.location = LocationManager(accuracy: kCLLocationAccuracyNearestTenMeters)
    }
    

    그리고 변수의 변화를 모니터링하기 위해 함수 .onChange를 사용할 수 있습니다.
    struct ContentView: View {
    
        @ObservedObject var location: LocationManager
    
        init() {
            self.location = LocationManager(accuracy: kCLLocationAccuracyNearestTenMeters)
        }
    
        var body: some View {
    
            Form {
                // TODO
            }
    
            .onChange(of: self.location.userLocation, perform: { value in
                if let receivedUpdate = value {
                    self.locationsRecorded.append(locationEntry(timeStamp: receivedUpdate.timestamp, coordinate: receivedUpdate.coordinate))
                }
            })
    
        }
    
    }
    

    트위터 @MszPro

    내 게시된 Qiita 기사 목록을 카테고리별로 확인할 수 있습니다.

    좋은 웹페이지 즐겨찾기