[SwiftUI] 3/27~4/7 알게 된 것

상 원·2023년 4월 8일
0

SwiftUI

목록 보기
4/4
post-thumbnail

List 뷰 해결

이렇게 list로 뷰 구성 시 양쪽으로 패딩이 생겼었다.

이걸 없애기 위해서는

.listStyle(GroupedListStyle()) 

모디파이어를 추가해 주면 된다.
디폴트 값이 GroupedListStyle이 아닌 InsetGroupedListStyle인 듯.

아니면

.listStyle(.inset)

를 추가하면 된다.

NavigationView는 네비게이션을 사용하기 시작하는 최상단 뷰에만 넣으면 된다.

NavigationLink가 들어가는 뷰마다 NavigationView를 넣게 되면 Back버튼이 중첩이 되는 끔찍한 일이 벌어진다..

처음 개발할 때 뭐가 잘못됐는지 모르고 이렇게 했다가 ViewRouter를 쓰는 상황까지 벌어졌었다.

NavigationView는 최상위 뷰에만 넣으면 된다는 것을 명심하자!

기본 NavigationView는 다음 뷰로 넘어갈 때마다 전환 효과가 기본적으로 들어간다.
이게 맘에 안 들어서 없앨 수도 없다.

WWDC22에서 NavigationView가 Deprecate되고 NavigationStack이 나오게 되었는데, 전환 효과를 없앨 수는 있지만 iOS16부터 사용이 가능하기 때문에 이걸 쓸 수도 없는 노릇이다.

이번 프로젝트에서는 이 문제를 해결하기 위해 커스텀 패키지 NavigationStack 을 사용했다.

NavigationStackView(transitionType: .none) {
            PushView(destination: SecondView()) {
                FirstView()
            }
        }

이런 식으로 사용하면 된다.
Stack인 만큼 Push, Pop으로 전환하는 방식이고, 뒤로 가고 싶다면 ?

PopView {
	Text("POP")
} 

단순히 이런 식으로 쓰면 된다. 진짜 쉬움!

PopView(destination: .root) {
	Text("POP TO ROOT")
}
PopView(destination: .view(withId: "aViewId")) {
	Text("POP TO THE SPECIFIED VIEW")
}

이런 식으로 root로 바로 갈 수도 있고, withId로 id를 설정해 Pop할 수도 있다.

struct ChildView: View {
    @ObservedObject var viewModel: ViewModel
    @EnvironmentObject private var navigationStack: NavigationStackCompat

    var body: some View {
        Button(action: {
            self.viewModel.performBackgroundActivities(withCallback: {
                self.navigationStack.pop()
            })
        }, label: {
            Text("START BG ACTIVITY")
        })
    }
}

써보진 않았지만 이런 식으로도 pop할 수 있다고 한다.

rawValue란 무엇일까

rawValue라는 단어가 굉장히 많이 보였다. 예전에 문법 공부할 때 본 것 같은데 아리까리해서 찾아봤다.

SwiftUI에서 Enum 타입의 값에 rawValue라는 속성이 있습니다. 이 속성은 해당 Enum 값의 기본값을 가져올 수 있도록 합니다. rawValue는 해당 Enum의 원시값(raw value)을 의미합니다. 이 값은 Int, String 등 여러 타입이 될 수 있습니다.
-from. chatGPT

라고 하네여.

ForEach에서의 에러 해결하기

ForEach에 리스트를 넣으면

Referencing initializer 'init(_:content:)' on 'ForEach' requires that 'Int' conform to 'Identifiable'

다음과 같은 에러메시지가 뜬다. 리스트가 Identifiable 하지 않기 때문에 일어나는 일로, 리스트의 각 요소를 구분할 수 없어서 나타나는 에러이다.

이 에러는 다음과 같은 식으로 해결할 수 있다.

ForEach(count, id: \.self) { num in
            Text("num: \(num)")
        }

각각의 원소에 id를 줌으로써 각 원소가 Identifiable하게 바꿔주는 것이다.
이런 경우는 각 원소값=id로 지정된다고 한다.

profile
ios developer

0개의 댓글