Странная панель инструментов с вложенным поведением условных обозначений

#swift #macos #swiftui

Вопрос:

Я получаю эту чрезвычайно странную проблему, когда, если у вас есть глубокая цепочка ViewBuilder операторов » s » и «if», а также панель инструментов, некоторые элементы на панели инструментов дублируются.

Вот изображение, чтобы показать, что я имею в виду (обратите внимание на 2 кнопки «Нажмите на меня!»)

скриншот)

Воспроизведение: (Примечание: Я использую бета-версию macOS Monterey 5 и бета-версию Xcode 13 5)

  1. Создайте новый пустой проект SwiftUI macOS
  2. Вставьте этот код в ContentView :
 struct ContentView: View {
    var body: some View {
        NavigationView {
            Text("Sidebar")
            SecondPanel()
        }
    }
}
struct SecondPanel: View {
    @State var num = 0
    
    @ViewBuilder var content: some View {
        Text("Line 2")
        Text("Line 3")
    }
    @ViewBuilder var contentWithToolbar: some View {
        content
            .toolbar {
                Button(action: {
                    num  = 1
                }) {
                    Text("Press me!")
                }
            }
    }
    var body: some View {
        if num == 0 {
            contentWithToolbar
                .navigationSubtitle("Num is zero!")
        }
        else {
            contentWithToolbar
        }
    }
}
 
  1. Запустите приложение. Вы должны увидеть две кнопки «Нажмите на меня!», хотя у меня только одна кнопка на панели инструментов!

Мне было интересно, что здесь происходит, и есть ли какой-либо способ решить эту проблему?

Комментарии:

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

2. @Джейк, я пытался удалить его, но, похоже, это не помогает

3. Окей… как насчет упаковки содержимого конструктора представлений содержимого в vstack?

4. @Jake Это, казалось, решило проблему, но изначально у меня была куча условий (отсюда и конструктор представлений).

5. Пожалуйста, не редактируйте свой вопрос, чтобы объявить, что он решен. Вот для чего нужны ответы. И вы уже опубликовали свой ответ (что здорово!). Соответственно, я откатил вашу правку.

Ответ №1:

@Jake указал, что проблема была вызвана тем, что 2 текстовых объекта были сложены без VStack буквы A.

Добавление a VStack полностью устранило проблему.