#swift #macos #swiftui
Вопрос:
Я получаю эту чрезвычайно странную проблему, когда, если у вас есть глубокая цепочка ViewBuilder
операторов » s » и «if», а также панель инструментов, некоторые элементы на панели инструментов дублируются.
Вот изображение, чтобы показать, что я имею в виду (обратите внимание на 2 кнопки «Нажмите на меня!»)
Воспроизведение: (Примечание: Я использую бета-версию macOS Monterey 5 и бета-версию Xcode 13 5)
- Создайте новый пустой проект SwiftUI macOS
- Вставьте этот код в
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. Попробуйте удалить аннотацию конструктора представлений с кнопки. Я бы обычно использовал это, если бы выполнял условную логику при создании этого представления. Поскольку вы не такой, все должно быть в порядке без аннотации
2. @Джейк, я пытался удалить его, но, похоже, это не помогает
3. Окей… как насчет упаковки содержимого конструктора представлений содержимого в vstack?
4. @Jake Это, казалось, решило проблему, но изначально у меня была куча условий (отсюда и конструктор представлений).
5. Пожалуйста, не редактируйте свой вопрос, чтобы объявить, что он решен. Вот для чего нужны ответы. И вы уже опубликовали свой ответ (что здорово!). Соответственно, я откатил вашу правку.
Ответ №1:
@Jake указал, что проблема была вызвана тем, что 2 текстовых объекта были сложены без VStack
буквы A.
Добавление a VStack
полностью устранило проблему.