forXifLess / LinkNavigator

🌊 Easy & Powerful navigation library in SwiftUI
Other
382 stars 27 forks source link

withAnimation이 작동하지 않습니다. #21

Closed Mercen-Lee closed 1 year ago

Mercen-Lee commented 1 year ago

LinkNavigator를 적용한 프로젝트를 MVVM에서 MVI로 마이그레이션 중입니다. MVI는 LinkNavigator의 MVI Example을 참고했습니다.

func mutate(action: TestModel.ViewAction, viewEffect: (() -> Void)?) {
    switch action { 
    case .updateData:
        withAnimation(.default) {
            state.data = 1
        }
    }
}

그런데 애니메이션이 적용되지 않습니다.

MVVM(ObservableObject@Published)를 사용했을 땐 작동했던 코드입니다. LinkNavigator가 아니라 Example에서 발생했지만, 해결할 방법이 마땅히 없어 이곳에 쓰게 되었습니다.

interactord commented 1 year ago

안녕하세요 이슈를 등록해주셔서 감사합니다.

해당 코드만으로는 원인과 해결파악이 어렵습니다.

실례가 되지 않는다면,제 메일로 소스코드를 작성해서 보내줄수 있을까요?

해결방법을 찾아 여기(이슈 댓글), 예제 샘플에도 업데이트 하도록 하겠습니다. 감사합니다

Mercen-Lee commented 1 year ago

프로필에서 이메일을 찾을 수 없습니다. 혹시 이메일을 알려주실 수 있나요?

Mercen-Lee commented 1 year ago

발송했습니다.

interactord commented 1 year ago

확인하고 댓글로 피드백 남겨드릴께요

interactord commented 1 year ago

메일로 첨부해주신 예제 소스 보고 수정하여 다시 전달드렸어요.

공유 차원에서 댓글을 남깁니다.

MVI에서의 State는 여러 상태를 관리를 하는 역할로 즉, 통합 상태라고 봅니다. 다만 해당 State는 withAnimation이 안먹는 부분이 있습니다. (TCA에서는 WithViewStore라고 따로 빼서 관리하여 잘됩니다.)

이경우에는, SwiftUI View에 .animation 수정자를 사용하여, 현재 에니메이션을 적용하고자하는 State 내부의 구체적인 상태 (isAnimation)이라는 값을 추가해주시면됩니다.

interactord commented 1 year ago

@Mercen-Lee 님 추가적으로 도움이 필요하거나, 문의가 있으실까요?

Mercen-Lee commented 1 year ago
if let data = state.data {
    RefreshableScrollView {
        intent.send(action: .refreshData)
    } content: {
        LazyVStack(spacing: 8) {
            ForEach(data, id: \.id) { row in
                SomeCell(data: row)
            }
        }
        .padding(12)
    }
}

보내주신 방법대로 테스트 코드에 적용해봤는데 잘 작동합니다...만 실제 제 프로젝트의 View가 이런 방식의 데이터 바인딩을 사용하기 때문에 이건 또 작동하지 않더라고요.

거기다가 애니메이션이 꽤 많아서 MVI보단 TCA로 가는 것이 적합하다고 판단했습니다. 아직 초보인지라 제 이해력이 부족해 발생한 이슈지만.. 도움 주셔서 정말 감사합니다.