Несколько элементов пользовательского интерфейса нарушают работу WidgetExtension

Я пытаюсь динамически создать представление, используя SwiftUI для своего виджета. Однако при наложении нескольких представлений виджет больше не работает. Я хочу перебрать свой виджет по массиву извлеченных данных, например:

VStack {
    ForEach(entry.layers.indices) { index in
        let layer = entry.layers[index]
        Text(layer)
    }
}

но это не работает должным образом, когда цикл forEach выполняется более 5 раз (он отлично работает, если цикл выполняется только один или два раза!). Я обратился в службу поддержки Apple Code Level по этому поводу, и они сказали мне, что это «ошибка». См. Предоставленный мной пример проекта: https://github.com/swifty-on-me/Widget-Example

Это данные, которые я пытаюсь отобразить: https://github.com/swifty-on-me/Widget-Example/blob/main/Data/FakeData.swift

Я пробовал что-то вроде преобразования представления в изображение но решение не работает в расширениях.

Итак, я нашел этот «обходной путь» на форумах разработчиков Apple, но не знаю, как его реализовать: https://developer.apple.com/forums/thread/665935

Может ли кто-нибудь объяснить или направить меня к этому обходному пути? (Я не очень хорошо себя чувствую со Swift (UI))

Я возился с этим целую вечность и думаю, что схожу с ума от того, что кажется такой простой задачей.

См. Этот пример (около 28 секунд)


person Kipnoedels    schedule 02.12.2020    source источник


Ответы (1)


Похоже, вы идете против того, как работает SwiftUI. У вас не должно быть кода внутри объявления представления. Я удивлен, что код вообще скомпилирован.

Вот где проблема:

GeometryReader { geo in
    ZStack(alignment: .topLeading) {
        Color.init("#bf1b49")
        VStack {
            ForEach(entry.layers.indices) { index in
                let layer = entry.layers[index] // < Here
                Text(layer)
            }
        }
    }
}

Я не совсем уверен, что вы здесь пытаетесь сделать, но для этого не нужны две строчки кода. Вы, вероятно, можете попробовать переместить entry.layers[index] в текст, потому что вам не нужно хранить для этого переменную. Нравится:

GeometryReader { geo in
    ZStack(alignment: .topLeading) {
        Color.init("#bf1b49")
        VStack {
            ForEach(entry.layers.indices) { index in
                Text(entry.layers[index])
            }
        }
    }
}

Обратите внимание, как let layer исчез, а код, составляющий layer, теперь находится непосредственно в тексте. Надеюсь, это поможет!

person Ben Sova    schedule 08.12.2020
comment
Спасибо за советы, но это, к сожалению, не решает проблемы. - person Kipnoedels; 09.12.2020
comment
@Kipnoedels Попробуйте подключить виджет к отладчику Xcode. Нет ли где-нибудь всплеска памяти? - person Ben Sova; 10.12.2020
comment
Нет, на widgetExtension он остается около 0,18%. ЦП тоже низкий. - person Kipnoedels; 10.12.2020
comment
К сожалению, никто не смог решить проблему, но я также считаю, что не наградить того, кто пытался. Итак, я назначаю награду за 11 минут до конца. - person Kipnoedels; 14.12.2020