개인 프로젝트로 SwiftUI를 사용하고 있습니다.
무엇보다 장점이 전체적인 작업 속도도 빨라지고,
뷰 만드는 것도 즐거워집니다. (레이아웃 컨스트레인트나 스토리보드는..)
그런데 이런저런 버그가 괴롭히네요 ㅠㅠ
오늘 발견한 버그는
parent view의 list view에 navigation view를 하고,
여기에 navigation title과 navigation bar item을 만들었습니다.
그리고 해당 list view의 row를 선택하면 navigation link로 child view로 넘어가서 자세하게 보여줍니다.
그런데 child view에도 navigation bar title 과 navigation bar item이 있습니다.
여기서!
화면 왼쪽 가장자리를 살짝 슬라이드했다가 놓으면 (되돌아가기를 하려다 놓아버린 상황)
1. navigation bar title이 bar 중앙으로 작게 고정됩니다. (원래는 다이나믹)
2. 이 상태에서 화면을 스크롤하려고 하면 바로 화면이 움직이지 않게 되고, 메모리가 폭증합니다 (크래시날때까지)
뭔가 잘못짠게 아닌가 하고 아무리 살펴봐도 특별한게 없네요.
스택오버플로우를 뒤져봐도 비슷한 상황은 간간히 있지만, 해결방법은 뚜렷하게 없습니다.
어쨌든 저 child view에서 navigation bar items만 없으면 아무 문제가 안 일어납니다.
음.. 결국 UI 변경으로 가야할지.. ㅠㅠ
그러나 타이틀과 버튼이 그대로 남아 parent view의 그것을 가리는 것은 변함없습니다 ㅠㅠ
SwiftUI가 아직은 진화하는 과정에 있다보니 UIKit 수준의 성숙함을 기대하기는 어려울 듯 하네요. 특히, 전반적으로 Container 기능의 Controller들이 좀 불안정한 것으로 판단됩니다. 만약 SwiftUI를 쓰실꺼라면 앱의 네비게이션 구조는 UIKit을 바탕으로 하시고 content가 되는 view 위주로 SwiftUI를 활용하심이 어떨까 하네요.
코드는 대략 아래와 같아요.
우선 parent view는
NavigationView {
ZStack {
List {
ForEach(self.events.sorted()) { event in
NavigationLink(
destination: EventDetailView(
id: event.id
)
.environmentObject(self.store)
) {
EventRowView(event: event)
}
}
}
.navigationBarTitle(self.theDay))
.navigationBarItems(trailing:
Button (action: {
self.showingAddEventView.toggle()
}) {
Image(systemName: "square.and.pencil")
}
)
}
대략 위와 같고,
child view는
ZStack {
HStack {
...
VStack {
...
List {
...
}
.navigationBarItems(trailing: navigationBarButton())
이런식으로 navigationBarItems가 있는데, 이게 어디에 있든,
위의 navigationBarButton()은 아래에서 보듯 conditional하게 view를 만들어주는데,
이게 아니라 그냥 알버튼을 만들어도 어쨌든 문제가 생깁니다.
navigationBarButton() 자체를 comment out 해야만 괜찮아져요 ㅋㅋ
private func navigationBarButton() -> some View {
return self.isEditing ?
AnyView(Button("Cancel") {
// just switch off editing mode
self.isEditing = false
// shut all the date pickers up
self.editingStartAt = false
self.editingEndAt = false
})
:
AnyView(Button("Edit") {
self.isEditing.toggle()
})
}
https://gist.github.com/heath-hwang/d268ec5dba9c1b77d1a0efcf9708743e
저도 달아주신 것 보고 오늘 삘 받아서 원인을 열심히 찾아본 결과~
드디어 밝혀냈습니다!
원인은 detail view에 @Environment(\.presentationMode) var presentationMode 이게 있으면 그런 현상이 나타나네요
아래 링크에 재현용 전체 코드를 올려두었습니다.
https://github.com/thegreatkingbear/NavigationViewTest
다시 한 번 감사드려요~
짤 수록 uikit으로 하게 될 정도로 예외 사항에 대한 처리가 어려운 것 같아요 ㅜㅜ
특히 처음에 SwiftUI에 익숙치 않을 때, 엉뚱한 에러메시지 때문에 엉뚱한 곳에서 시간 많이 버렸습니다 ㅋㅋㅋ