Làm cách nào để tắt hoạt ảnh trong danh sách khi quan sát thay đổi đối tượng trong SwiftUI?


15

Làm cách nào để tắt hoạt hình khi xem thay đổi dữ liệu mô hình?

Tôi có đoạn mã sau:

struct FormView: View {

    @ObservedObject var viewModel: FormViewModel

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

Mỗi lần thay đổi mô hình xem Listđược cập nhật với hình ảnh động.
Làm thế nào tôi có thể vô hiệu hóa nó?
Tôi đã thử thêm .animation(nil)nhưng không được

Câu trả lời:


1

Cách giải quyết cho đến khi Apple cung cấp cho chúng tôi một thay đổi để thực hiện trên Danh sách là gọi List.id (_ :) Nó thay đổi trạng thái bên trong của Danh sách và buộc Danh sách phải tạo lại ngay lập tức mà không cần bất kỳ hình ảnh động nào. Để biết chi tiết, xem Danh sách tải lại hoạt hình trục trặc

Điều tương tự có thể được thực hiện trên bất kỳ Chế độ xem nào (func id () là một phần của giao thức Xem), nhưng bạn phải biết rằng tất cả các biến trạng thái sẽ có trạng thái "mặc định" ban đầu, vì vậy hãy sử dụng cẩn thận. Nó giống như "tái tạo" View.

Để có thể hiểu cách thức hoạt động của nó, hãy xem https://swiftui-lab.com/swiftui-id/


1

Giải pháp tôi tìm thấy là thêm một mã định danh duy nhất thay đổi mỗi lần, vì vậy nó sẽ xây dựng lại danh sách mỗi lần mà không cần hoạt hình. Đã xác minh trên iOS 13.4.

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

-3
  1. Không cần sử dụng ForEach bên trong Danh sách trong trường hợp bạn không sử dụng Section. Vì vậy, thay vì:

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

    Các mã sau đây là đủ để viết:

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

    Và cũng tốt hơn để biết rằng việc sử dụng ForEach có thể tạo ra một số vấn đề, ví dụ: SwiftUI: có thể sử dụng ForEach + ContextMothy không?

  2. Trong trường hợp bạn sẽ chỉ sử dụng ForEach()hoặc chỉ List()+.animation(nil) - phải giải quyết vấn đề của bạn:

    Mẫu 1:

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

    Mẫu 2:

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

    Tôi đã được thử nghiệm cả trên macOS 10.15.2 (19C57) và nó hoạt động hoàn hảo.

  3. Ngoài ra, bạn có thể thử sử dụng .animation(nil)trên ListForEachcả hai. Tôi đã không thử ... nhưng tôi nghĩ điều này cũng sẽ mang lại cho bạn hiệu quả cần thiết.

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

.animation(nil)Thật không may, không có hiệu lực vào ngày 13.3, thật không may
Fabian Streitel

@FabianStreitel Tôi đã được thử nghiệm phần 2 trên macOS 10.15.2 (19C57) và nó hoạt động hoàn hảo.
Andrew

Và tôi đã thử nghiệm cả ba biến thể trên iOS 13.3 (như đã nêu trong nhận xét của tôi ở trên) và không có biến thể nào trong số chúng thay đổi hành vi Danh sách cả. Thật không may, OP không nói rõ họ đang tạo một ứng dụng iOS hay macOS. Nhưng tôi nghĩ rằng thông tin mà nó không hoạt động trên iOS cũng phù hợp với những người khác.
Fabian Streitel

Gần đây tôi đã thử nghiệm .animation(nil)bằng Xcode 11.4 với iOS 13.4 và nó hoạt động với tôi.
Simen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.