- bounty将在5天后过期**。回答此问题可获得+50的声誉奖励。christophriepe正在寻找此问题的更详细的答案。
- 背景**
我在SwiftUI
Toolbar
中有一个Menu
(包括多个Buttons
),在Toolbar
中也有一个.sheet()
Modifier
。
问题是,使用show.toggle()
操作按下Button
不会按预期显示Sheet
。
- 重要提示:**我注意到了一个奇怪的行为,当我给
showOption
一个像var showOption: Option? = .option1
这样的初始值时,它工作得非常好 (当然除了初始的Sheet
弹出窗口)。 但是,一旦我用nil
初始化showOption
属性,它就崩溃了。
- 重要提示:**我注意到了一个奇怪的行为,当我给
- 代码**
struct MainView: View {
var showOption: Option?
// var showOption: Option? = .option -> this would work perfectly fine.
var body: some View {
NavigationStack {
Text("Hello World")
.toolbar {
ToolbarItem {
Menu {
... Button(action: { option = .option1 } { ... } ...
}
.sheet(item: $showOption) { option in
switch option {
case .option1: Text("Hello World 1")
...
}
}
}
}
}
}
}
- 问题**
- 这是由于
.sheet()
位于Toolbar
内部造成的,还是我遗漏了其他内容? - 如何解决这个问题(理想情况下,不需要将
.sheet()
移出Toolbar
)?
3条答案
按热度按时间ar7v8xwq1#
如果您将其移出
Menu
(仍在工具栏中),它将正常工作:6tr1vspr2#
在SwiftUI中,每当我们应用修改器来查看它时,它实际上创建了一个应用了该更改的新视图,而不是修改该位置的现有视图。我们的视图只保留我们给予它们的确切属性。2请看下面的示例代码。
Swift的
type(of:)
方法打印特定视图/值的确切类型,如果我们在Menu下添加.sheet
修饰符,print(of:)
将显示以下输出已修改内容〈文本,工具栏修饰符〈(),元组工具栏内容〈工具栏项〈(),已修改内容〈菜单〈文本,按钮〉,图纸演示修饰符〉〉〉〉
按以下方式嵌套元素:文本-〉工具栏修饰符-〉元组工具栏内容-〉工具栏项目-〉
ModifiedContent -> Menu -> Text -> Button -> SheetPresentationModifier
如果我们在按钮下添加
.sheet
修饰符print(of:)
将显示以下输出已修改内容〈文本,工具栏修饰符〈(),元组工具栏内容〈工具栏项〈(),菜单〈文本,已修改内容〈按钮,图纸演示修饰符〉〉〉〉
按以下方式嵌套元素:文本-〉工具栏修改器-〉元组工具栏内容-〉工具栏项目-〉菜单-〉文本-〉修改的内容-〉按钮-〉图纸演示修改器
因此,正如我们之前讨论的,修饰符的顺序会影响SwiftUI的功能。如果我们将
.sheet
添加到Menu元素,则它将具有特定于ModifiedContent的附加功能或外观,并显示表单。而对于buttonModifiedContent的情况,则不起作用。3zwtqj6y3#
如果将
.sheet
从Menu
中移出,答案仍然相同,并且仍然有效: