본문 바로가기

Dev/SwiftUI9

[SwiftUI] ObservableObject, ObservedObject, Published SwiftUI로 뷰와 로직을 작성하다 보면 데이터 관리에 대한 고민에 부딪히게 된다.특히 여러 뷰에서 동일한 데이터를 공유하고 업데이트해야 하는 상황에서 State나 Binding만으로는 한계가 있다. 이때 Combine 프레임워크의 핵심 요소인ObservableObject, ObservedObject, 그리고 Published를 이해하는 것이 중요하다. State와 Binding은 주로 상위-하위 뷰 간의 명확한 데이터 흐름에 적합하며, 단일 뷰 내부 또는 계층적으로 연결된 뷰에서 사용하기 좋다. 하지만 외부에 선언된 값을 여러 뷰에서 관찰하고 그 값의 변화에 따라 UI를 업데이트해야 하는 상황에서는 이벤트 변화를 관찰하는 ObservableObject와 ObservedObject가 더 적합하다. .. 2024. 10. 7.
[SwiftUI] Navigation 참여 중인 회사 프로젝트에서 UIKit과 SwiftUI 프레임워크를 함께 사용하고 있다. 탭바와 같은 화면 전환은 UIKit을 사용하고 있지만 사실 SwiftUI의 내비게이션 기능을 제대로 사용해 본 경험이 없었다. 대신 틈나는 대로 직관로그 UI를 SwiftUI로 리팩토링하고 있어서 겸사겸사 화면 전환 관련 로직을 다루기 전 사전 학습으로 SwiftUI의 내비게이션을 조금 뜯어보기로 했다. 참고로, 이 글에서 다룰 Navigation은 iOS 16 이상을 기준으로 작성했다. iOS 16 이전엔 NavigationView를 사용했지만, iOS 16에선 해당 API가 deprecated가 되었다.이 글에선 NavigationView에 대한 내용은 다루지 않을 예정이다. 애플 공식 문서에 따르면,.. 2024. 9. 24.
[SwiftUI] scrollTargetLayout과 ScrollTargetBehavior iOS 17 이전까지 ScrollView는 제한적인 부분이 많았다. 특히 오프셋을 직접 구현해서 페이징 기능을 커스텀으로 만들어야 하는 불편함이 있었지만, 애플이 iOS 17에 scrollTargetLayout과 scrollTargetBehavior를 추가하면서 이제 단 두 줄의 코드만으로 이 기능 구현이 가능해졌다. 우선, 해당 기능에 대해 애플문서로 간략하게 알아보자. 정의scrollTargetLayout스크롤 액션이 일어날 때 어떤 레이아웃을 기점으로 스크롤이 이루어질지 정하는 역할을 한다.ViewAlignedScrollTargetBehavior와 함께 사용되어 스크롤 뷰가 특정 뷰나 콘텐츠에 정확히 정렬되도록 돕는다. ScrollTargetBehavior스크롤 가능한 뷰의 스크롤 동작을 정의하.. 2024. 8. 16.
[SwiftUI] Property Wrapper 총정리 SwiftUI는 선언형 UI 프레임워크로, 뷰의 상태 변화에 따라 UI가 자동으로 업데이트되는 강력한 기능을 제공한다. 이러한 자동 업데이트의 핵심에는 PropertyWrapper가 있다. PropertyWrapper는 데이터를 캡슐화하고 특정 로직을 적용하여 뷰와 데이터 간의 효율적인 통신을 가능하게 한다. 이 글에서는 SwiftUI 개발에 필수적인 다양한 PropertyWrapper의 개념과 용도, 그리고 iOS 17에서 새로 도입된 @Bindable까지 훑어가는 방식으로 정말 간단하게 다뤄보기로 했다. PropertyWrapper정의Swift 5.1 버전부터 도입된 문법정의된 property가 있을 때 해당 property를 감싸서 특별한 타입으로 만들어준다프로퍼티를 저장하는 코드와 프로퍼티.. 2024. 7. 26.
[SwiftUI] Frame SwiftUI로 뷰를 그리다보면 frame 때문에 애를 먹는 경험을 종종 하게 된다. 최근 회사 프로젝트의 메인 홈 화면 개편 작업 중에도 동일한 상황을 겪었고,이를 계기로 frame 모디파이어를 정리하게 되었다. 고정 frameframe은 뷰의 사이즈와 위치를 결정하는 데 사용된다.즉, 뷰의 너비, 높이, 최소/최대 크기, 정렬 방식 등을 정의할 수 있다.func frame( width: CGFloat? = nil, height: CGFloat? = nil, alignment: Alignment = .center) -> some View width, height를 nil로 지정하면 콘텐츠 크기에 따라 자동으로 설정된다.alignment의 기본값은 .center이며, .top, .bottom,.. 2024. 7. 22.
[SwiftUI] @State @State?PropertyWrapper로, SwiftUI에서 변하는 변수의 상태에 따라 값을 읽어주거나 바꿔주는 역할(값 자체 X, 수단 O)을 한다.해당 속성을 사용할 때 변수 앞에 @State 를 붙여서 사용한다.상태를 변경 할 때마다 body속성이 재설정되기 때문에, 해당 state 변수를 사용하는 뷰는 변화를 감지할 때마다 자동으로 뷰를 새로 렌더링한다.사용자 액션에 따라 UI를 변경해주는 데에 주로 사용된다.@State는 선언한 뷰 외에선 값을 변경할 수 없으며 (변경하려면 $를 붙인 바인딩을 이용해야한다), 그렇기 때문에 @State 변수를 활용하려면 가장 상위 뷰에서 작성하며 private 접근 제어자를 붙여야한다. ---> 접근 제어자를 붙이는 이유는 초기화 단계에서 설정하는 걸 방지하기.. 2024. 5. 22.