Почему makeUIView вызывается несколько раз внутри TabView?

В моем приложении есть TabView (PageTabViewStyle), и на каждой вкладке есть UIViewRepresentable. Я упростил код, чтобы получить минимально воспроизводимый пример ниже. Проблема в том, что makeUIView вызывается несколько раз, когда он появляется, и снова несколько раз при пролистывании страниц.

К вашему сведению, это не было проблемой в iOS 14.0, но происходит в iOS 14.2. В данный момент я использую релиз-кандидат Xcode 12.2.

import SwiftUI

struct MakeUIViewTest: View {
    var body: some View {
        TabView {
            CustomViewRepresentable(color: .red, index: 0)
            CustomViewRepresentable(color: .blue, index: 1)
            CustomViewRepresentable(color: .gray, index: 2)
        }
        .tabViewStyle(PageTabViewStyle())
    }
}

struct MakeUIViewTest_Previews: PreviewProvider {
    static var previews: some View {
        MakeUIViewTest()
    }
}

struct CustomViewRepresentable: UIViewRepresentable {
    
    var color: UIColor
    var index: Int
            
    func updateUIView(_ uiView: UIViewType, context: Context) {
        
    }
    
    func makeUIView(context: Context) -> UIView {
        print("MAKING UI VIEW NOW. INDEX \(index)")
        let view = UIView(frame: .zero)
        view.backgroundColor = color
        return view
    }

}

Когда появится экран, консоль напечатает:

MAKING UI VIEW NOW. INDEX 0
MAKING UI VIEW NOW. INDEX 0
MAKING UI VIEW NOW. INDEX 0
MAKING UI VIEW NOW. INDEX 0
MAKING UI VIEW NOW. INDEX 0

И когда я один раз провожу вправо, он печатает:

MAKING UI VIEW NOW. INDEX 1
MAKING UI VIEW NOW. INDEX 2
MAKING UI VIEW NOW. INDEX 1
MAKING UI VIEW NOW. INDEX 1
MAKING UI VIEW NOW. INDEX 1
MAKING UI VIEW NOW. INDEX 1
MAKING UI VIEW NOW. INDEX 2

1 ответ

Вы должны реализовать этот метод и использовать его для создания объекта представления. Настройте представление, используя текущие данные вашего приложения и содержимое параметра контекста. Система вызывает этот метод только один раз, когда создает представление в первый раз. Для всех последующих обновлений система вызывает метод updateUIView(_:context:). Надеюсь это поможет. https://developer.apple.com/documentation/swiftui/uiviewrepresentable/makeuiview(контекст:)

Другие вопросы по тегам