인프런 커뮤니티 질문&답변

coffee1oz님의 프로필 이미지

작성한 질문수

[Lv.2] 레벨업 - SwiftUI intermediate with Core Data, SwiftData

Weak Self

강의 Weak Self 코드 실행시 오류에 대해

23.10.21 17:35 작성

·

476

0

강의에 대한 프로그램 실행을 하면 아래와 같은 에러가나고

화면상에 숫자는 "1"로 고정이 되네요.

강의 원본 소스도 같은 에러를 내보냅니다.

Xcode는 15.0.1

아이폰 모델은 15 Pro입니다

 

  1. 콘솔 로그

초기화 시작

Snapshotting a view (0x10b42e7e0, _UIButtonBarStackView) that is not in a visible window requires afterScreenUpdates:YES.

초기화 시작

초기화 해제

Snapshotting a view (0x10597b1c0, _UIButtonBarStackView) that is not in a visible window requires afterScreenUpdates:YES.

초기화 시작

초기화 해제

 

 

  1. 소스

//

//  WeakSelfInter.swift

//  SwiftUiIntermediate

//

//  Created by KISOO LEE on 10/7/23.

//

 

import SwiftUI

 

 

// MARK: - ViewModel

class WeakSelfInterViewModel: ObservableObject {

    @Published var data: String? = nil

    

    init() {

        print("초기화 시작")

        let currentCount = UserDefaults.standard.integer(forKey: "count")

        UserDefaults.standard.set(currentCount+1, forKey: "count")

        getData()

    }

    

    deinit {

        print("초기화 해제")

        let currentCount = UserDefaults.standard.integer(forKey: "count")

        UserDefaults.standard.set(currentCount-1, forKey: "count")

    }

    

    func getData() {

        DispatchQueue.main.asyncAfter(deadline: .now() + 10) {

            DispatchQueue.main.async {

                self.data = "NEW DATA !"

            }

        }

    }

    

}

 

// MARK: - Screen 1

struct WeakSelfInter: View {

    @AppStorage ("count") var count: Int?

 

    init() {

        count = 0

    }

    

    var body: some View {

        NavigationView {

            NavigationLink("2번째 페이지로 이동"){

                WeakSelfInter2()

            }

            .navigationTitle("1번째 페이지")

            //: NavigationLink

        } //: NavigationView

        .overlay(

            Text("\(count ?? 0)")

                .font(.largeTitle)

                .padding()

                .background(Color.green.cornerRadius(10))

                .padding()

            , alignment:  .topTrailing

        )

 

    }

}

 

// MARK: - Screen 2

struct WeakSelfInter2: View {

    

    @StateObject var vm: WeakSelfInterViewModel = .init()

    

    var body: some View {

        VStack (spacing: 10 ) {

            Text("2번째 페이지")

                .font(.largeTitle)

                .foregroundColor(.red)

        } //: VStack

        

        if let data = vm.data { // data에 String 값이 있는 경우

            Text(data)

        }

    }

}

 

#Preview {

    WeakSelfInter()

}

 

답변 1

0

Jacob(제이콥)님의 프로필 이미지
Jacob(제이콥)
지식공유자

2023. 10. 23. 15:40

안녕하세요 coffee1oz 님.

질문주신 코드에 관한 에러 및 1로 고정되는 현상은 NavigationView 가 Xcode 버전업과 iOS 17 버전으로 deprecated 에 대한 error 인거 같습니다. error message 에 대한 내용은 정확히 확인 할 수 없으나,

NavigationStack 으로 변경 후 시뮬레이션 실행한 결과 error message 가 없어졌으며, 포인팅되서 1이 되고 초기화 해제 함에따라 숫자가 다시 0으로 변경되는것을 확인하였습니다.

변경된 코드는 다음과 같습니다.

image

image

image

 

변경된 예제 코드도 함께 강의자료에 업로드해서 수정하였습니다.

error 가 발생된것을 알려주셔서 감사합니다

 

coffee1oz님의 프로필 이미지
coffee1oz
질문자

2023. 10. 23. 17:39

프리뷰에서 상태 숫자의 값은 0, 1 변경이 잘되는데 시뮤레이터 기동은 안되네요.

그리고, ios 버전이 16이상만 사용 가능 합니다. 제가 app 버전을 16.0으로 변경해서 에러를 없앤 후 실행 한겁니다.

image