본문 바로가기
SwiftUI

SwiftUI)Preview Crashed는 왜 일어날까

by 김 Duke 2023. 4. 10.

목차

    스유를 하다보면 Preview가 아주 유용하다는 것을 알 수 있다.

    일일이 시뮬을 구동하여 확인하지 않아도 되고, 셀렉터블 프리뷰를 이용하여 컴포넌트들이 차지하는 공간을 확인할 수 있는 것이 특히 장점이다.

     

     

    평소 프리뷰 크래시를 많이 겪었던 사례

    MVVM 패턴에서 EnvironmentObject를 사용할 때이다.

    하위 뷰에서 객체를 쓰고, 상위뷰에서 객체를 안쓴다고 프리뷰에 .environmentObject를 안써줬다간 바로 크래시가 난다.

    관련해서는 따로 글을 작성했다.

    https://yahoth.tistory.com/16

     

    SwiftUI) Preview 크래시 발생 사례 (EnvironmentObject)

    스유를 사용하다보면 Preview에서 크래시가 종종 일어난다. 사실 이전에 Preview 크래시 관련 글을 작성했었는데, 그땐 일반적인 문제보다 특수 경우였고 xcode 버그로 판명났다. 근데 그 글이 구글에

    yahoth.tistory.com

     

     

     

     

    내가 겪은 사례

    잘 사용하고 있었는데(UIKit에 익숙한 몇몇 친구들은 잘 안쓰기도 하더라),  프로젝트를 진행하던 도중 원인 모를 Preview Crash가 발생했다. 처음엔 코어데이터로 인해 프리뷰에 오류가 생긴 줄 알았지만 코드를 하나하나 소거해보고 프로젝트를 새로 만들었는데도 오류가 사라지지 않았다

     

     

     

     

    문제의 코드

    문제는 toolbar의 버튼을 통해서 sheet를 열려고 할 때 발생했다.

    struct SwiftUIView: View {
        @State var isSheetShowing = false
        var body: some View {
            NavigationStack {
                VStack {
                    Text("상단의 버튼을 누르면 시트가 올라와야함")
                }
                .toolbar {
                    Button("add") {
                        isSheetShowing.toggle()
                    }
                }
                .sheet(isPresented: $isSheetShowing) {
                    EmptyView()
                }
            }
        }
    }

    Toolbar의 add 버튼을 누르면 크래쉬가 난다.

     

     

    구글링해봤지만 관련한 글을 찾을 수 없었다.

     

    그래서 StackOvewFlow에 질문을 올렸다. 질문: 링크

     

    SwiftUI) Preview crashes when trying to open a sheet with the button on the Tool bar

    struct SwiftUIView: View { @State var isSheetShowing = false var body: some View { NavigationStack { VStack { Text("hello") } ...

    stackoverflow.com

     

     

     

    하지만 질문에도 해결책을 찾을 수 없어서, 조금 더 근본적으로 해결해보려고 한다.

     

    Preview crash의 원인을 chatGPT한테 물어봤다.

    1️⃣ 첫 번째, 코드는 단순하기 때문에 문제가 되지 않는다. 혹시 몰라 toolbar안에 ToolbarItem도 넣어보고, depreacate된 navigationBarItems도 해보았는데 전부 작동하지 않았다.

     

    2️⃣ 두 번째와 4️⃣ 네 번째의 경우, 특정 상황에만 크래시가 발생되기 때문에 설정문제라고 할 수 없다. 그리고 3개 프로젝트에서 테스트해봤는데 모두 동일했다.

     

    가장 유력한 것은 3️⃣ 세 번째이다. 구글링을 통해 preview crash 상황에 해결한 경우를 찾아보았다.

     

    시도한 것들

    - DerivedData 삭제 참고

    - 프리뷰 기기 변경

    - [ xcrun simctl --set previews delete all ] 코드를 통해 프리뷰 설정 전부 삭제  참고

    - Library-Xcode-UserData-Previews 폴더의 Simulator Devices 안의 데이터 전부 삭제 

     

     

     

     

    결론

    시도한 것들 중 위의 3개는 효과가 없었고.

    마지막 항목을 시도했을 때, 아래 표시를 나타내며 프리뷰가 무한 로딩되었다.

    Preparing Iphone Simulator for Previews

     

    툴바와 관련된 것은 내가 올린 글이 답변을 달아주신 분 중에, 비슷한 상황이신 분이 계셨다.

    그 분의 말에 의하면 일종의 버그라고 생각된다. 일단 시뮬레이터에선 정상 작동되니,

    해결이 된다면 관련 글을 작성하겠다.

     

     

     

    문제 해결

    --------------------------------------------------------Solved--------------------------------------------------------


    2024.1.17 프로젝트를 다시 확인해보니 프리뷰가 정상 작동함. Xcode 버그로 추정

     


    TOP

    Designed by 티스토리