Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Refactoring
- 리펙터링
- Observable
- ribs
- Clean Code
- uitableview
- 클린 코드
- collectionview
- UICollectionView
- 리펙토링
- Xcode
- SWIFT
- ios
- tableView
- swift documentation
- combine
- MVVM
- rxswift
- Protocol
- UITextView
- 리팩토링
- HIG
- 애니메이션
- swiftUI
- RxCocoa
- map
- Human interface guide
- uiscrollview
- clean architecture
- 스위프트
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - SwiftUI] @StateObject 사용 주의 사항 (Accessing StateObject's object without being installed on a View. This will create a new instance each time.) 본문
iOS 응용 (SwiftUI)
[iOS - SwiftUI] @StateObject 사용 주의 사항 (Accessing StateObject's object without being installed on a View. This will create a new instance each time.)
jake-kim 2024. 9. 20. 01:51@StateObject 사용하다 보는 주의 메시지
- StateObject의 객체에 접근하다보면 가끔 뷰 install되기 전에 StateObject의 객체 접근하여 매번 새로운 인스턴스가 생성된다는 문구가 등장
- 전체 코드는 아래와 같고, 이 원인 제공은 바로 @StateObject로 선언한 object의 값을 변경할 때 발생
@main
struct ExStateObjectApp: App {
var contentView = ContentView()
var body: some Scene {
WindowGroup {
contentView
.onAppear {
contentView.changeAge()
}
}
}
}
class MyObject: ObservableObject {
@Published var age = 0
}
struct ContentView: View {
@StateObject var object = MyObject()
var body: some View {
VStack {
Text("age: \(object.age)")
}
.padding()
}
func changeAge() {
object.age = 1
}
}
- 발생 지점은 ContentView의 changeAge() 메서드
- 실제로 object.age = 1을해도 변경되지 않음
에러의 정체
Accessing StateObject's object without being installed on a View.
This will create a new instance each time.
- @StateObject를 선언한다는 의미는 해당 뷰에서 이 인스턴스의 라이프사이클은 해당 뷰에서 결정한다는 의미
- @StateObject를 선언된 곳 외부에서 호출하면 해당 뷰 라이프사이클 외부에서 호출한 것이므로 경고 메시지가 표출되는 것
- 그렇다면 @StateObject의 사용처는?
@StateObject 사용처
- 상위 뷰와 하위 뷰가 있을 때, 상위 뷰에서 어떤 상태도 변경시키지 않고 하위 뷰에서만 변경하는 경우, 상위 뷰에서 @StateObject로 선언하고 하위 뷰에서 @ObservedObject로 선언하여 사용
- 구체적인 관련 내용: https://ios-development.tistory.com/1736
* 읽어보면 좋은 글
- @StateObject vs @ObservedObject (#ViewModel, 뷰 상태관리)
- @StateObject, @EnvironmentObject, @ObservedObject 때에 맞게 사용하기
* 참고
'iOS 응용 (SwiftUI)' 카테고리의 다른 글
[iOS - SwiftUI] onAppear 호출 타이밍 (0) | 2024.09.30 |
---|---|
[iOS -SwiftUI] @StateObject, @ObservedObject, @EnvironmentObject 때에 맞게 사용하기 (데이터 넘기기, 부모 뷰 -> 자식 뷰) (0) | 2024.09.23 |
[iOS - SwiftUI] @State 사용 주의사항 (뷰 업데이트) (3) | 2024.09.16 |
[iOS - SwiftUI] @StateObject vs @ObservedObject (#ViewModel, 뷰 상태관리) (2) | 2024.09.13 |
[iOS - SwiftUI] @ViewBuilder 기능 (0) | 2024.09.11 |
Comments