뷰 모델 데이터 변경시 애니메이션을 비활성화하려면 어떻게합니까?
다음 코드가 있습니다.
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
}
답변
-
를 사용하지 않는 경우 List 내부에서 ForEach를 사용할 필요가 없습니다
Section
. 따라서 대신 :List { ForEach(viewModel.options) { option in Text(option.displayValue) }) }
다음 코드는 작성하기에 충분합니다.
List(viewModel.options) { option in Text(option.displayValue) }
또한 ForEach를 사용하면 몇 가지 문제가 발생할 수 있습니다. 예 : SwiftUI : ForEach + ContextMenu를 사용할 수 있습니까?
-
+
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)에서 모두 테스트되었으며 완벽하게 작동합니다.
-
또한 당신은 사용을 시도 할 수 있습니다
.animation(nil)
에List
와ForEach
모두. 나는 시도하지 않았다. 그러나 나는 이것이 또한 당신에게 필요한 효과를 줄 것이라고 생각한다.List { ForEach(viewModel.options) { option in Text(option.displayValue) }.animation(nil) }.animation(nil)