[ios] SwiftUI에서 객체 변경이 관찰 될 때 목록에서 애니메이션을 비활성화하는 방법은 무엇입니까?

뷰 모델 데이터 변경시 애니메이션을 비활성화하려면 어떻게합니까?

다음 코드가 있습니다.

struct FormView: View {

    @ObservedObject var viewModel: FormViewModel

    var body: some View {
        List {
            ForEach(viewModel.options) { option in
                Text(option.displayValue)
            }
        }
    }
}

뷰 모델 변경 사항 List이 애니메이션으로 업데이트 될 때마다
어떻게 비활성화합니까?
추가를 시도 .animation(nil)했지만 도움이되지 않습니다.



답변

Apple이 List에서 변경을 할 때까지 해결 방법은 List.id (_ :)입니다. List의 내부 상태를 변경하고 애니메이션없이 List를 즉시 다시 만들도록합니다. 자세한 내용은 애니메이션 재 장전 목록 재로드 를 참조하십시오.

모든 View에서 동일한 작업을 수행 할 수 있지만 (func id ()는 View 프로토콜의 일부 임) 모든 상태 변수가 초기 “기본”상태를 가지므로주의해서 사용해야합니다. 뷰를 “다시 작성”하는 것과 같습니다.

작동 방식을 이해하려면 https://swiftui-lab.com/swiftui-id/를 참조 하십시오.


답변

내가 찾은 해결책은 매번 변경되는 고유 식별자를 추가하여 애니메이션없이 매번 목록을 다시 작성하는 것입니다. iOS 13.4에서 확인되었습니다.

var body: some View {
    List {
        ForEach(viewModel.options) { option in
            Text(option.displayValue)
        }
    }
    .id(UUID()) // no animation
}


답변

  1. 를 사용하지 않는 경우 List 내부에서 ForEach를 사용할 필요가 없습니다 Section. 따라서 대신 :

    List {
        ForEach(viewModel.options) { option in
            Text(option.displayValue)
        })
    }

    다음 코드는 작성하기에 충분합니다.

    List(viewModel.options) { option in
        Text(option.displayValue)
    }

    또한 ForEach를 사용하면 몇 가지 문제가 발생할 수 있습니다. 예 : SwiftUI : ForEach + ContextMenu를 사용할 수 있습니까?

  2. + ForEach()만 사용 하거나 List()+ 만 사용하는 경우 .animation(nil)문제를 해결해야합니다.

    샘플 1 :

    ForEach(viewModel.options) { option in
        Text(option.displayValue)
    }.animation(nil)

    샘플 2 :

    List(viewModel.options) { option in
        Text(option.displayValue)
    }.animation(nil)

    macOS 10.15.2 (19C57)에서 모두 테스트되었으며 완벽하게 작동합니다.

  3. 또한 당신은 사용을 시도 할 수 있습니다 .animation(nil)ListForEach모두. 나는 시도하지 않았다. 그러나 나는 이것이 또한 당신에게 필요한 효과를 줄 것이라고 생각한다.

    List {
        ForEach(viewModel.options) { option in
            Text(option.displayValue)
        }.animation(nil)
    }.animation(nil)

답변