ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SwiftUI] NavigationLink pop push 깜빡이는 문제
    개발/Swift 2025. 4. 8. 09:31

    상황

    case let .reportAction(action):
                    switch action {
                    case .report(.dismiss):
                        state.report = nil
                    case let .report(.presented(action)):
                        switch action {
                        case let .reportSuccess(contentType, id):
                            state.report = nil
                            return .concatenate(
                                .send(.removeAllComments),
                                fetchCommentsEffect(boardId: state.boardId, postId: state.postId, nextPageToken: nil),
                                .send(.reportAction(.disableReport(contentType: contentType, id: id))),
                                .send(.reportAction(.showReport(false))),
                                .send(.reportAction(.showReportSuccess(true))),
                            )
                        default:
                            return .none
                        }
    

    성공시 부모뷰에서 다음 로직을 수행함

    1. 댓글 리스트 refresh
    2. 현재 페이지 안보이게 ( 현재 페이지 NavitagionLink 로 Push된 상태)
    3. 다음 페이지 보이게 ( 다음페이지 NavitagionLink 로 Push 해야 함)
    4. 현재 페이지 상태 제거

    원인

       NavigationLink(
                destination:
                    IfLetStore(
                        store.scope(state: \\.$report, action: \\.reportAction.report)
                    ) {  CommunityReportView(store: $0) },
                isActive: $store.showReport.sending(\\.reportAction.showReport),
                label: {EmptyView()})
    
    1. 현재 페이지 상태제거 되면서 현재 페이지가 EmptyView로 바뀌며 네비게이션이 노출됨
    2. 그러고 0.1 초 후 실제 네비게이션이 돌아서 정상 노출

    해결

     

    해결은 isActive 바인딩으로 페이지를 끄지않고 (showReport 상태와 액션)

    dismiss 액션으로 끄는 방법을 쓰면 됨

     case let .reportAction(action):
                    switch action {
                    case .report(.dismiss): // 여기서 상태 제거됨
                        state.report = nil
                    case let .report(.presented(action)):
                        switch action {
                        case let .reportSuccess(contentType, id):
    		                    ///state.report = nil 제거
                            return .concatenate(
                                .send(.removeAllComments),
                                fetchCommentsEffect(boardId: state.boardId, postId: state.postId, nextPageToken: nil),
                                .send(.reportAction(.disableReport(contentType: contentType, id: id))),
                                .send(.reportAction(.report(.dismiss))), // 이거로 끔
                                .send(.reportAction(.showReportSuccess(true)))
                            )
                        default:
                            return .none
                        }
    

    댓글

Designed by Tistory.