无法在 iPad 上通过 SwiftUI 中的 NavigationBarItem 呈现 ActionSheet
Unable to present ActionSheet via a NavigationBarItem in SwiftUI on an iPad
首先,我看过一个类似的问题,但它没有解决我的用例。
我的问题是我的 NavigationView
中有一个 NavigationBarItem
,按下时会切换 ActionSheet
。此行为在 iPhone.
上使用时正常工作
但是,当我在 iPad 上使用它时,我屏幕上的两个按钮都会变灰并且没有任何反应。再次单击按钮将使它们处于活动状态(蓝色),但同样不会显示 sheet。
最后,如果我 select 屏幕中间的按钮(显示按钮),则 ActionSheet 会正确显示在 iPad。
我已经用 Xcode 11 & iOS 13.5 和 Xcode 12 & iOS 14 进行了测试。行为没有变化。
import SwiftUI
struct ContentView: View {
@State private var isButtonSheetPresented = false
@State private var isNavButtonSheetPresented = false
var body: some View {
NavigationView {
Button(action: {
// Works on iPad & iPhone
self.isButtonSheetPresented.toggle()
}) {
Text("Show Button")
}
.actionSheet(isPresented: $isButtonSheetPresented,
content: {
ActionSheet(title: Text("ActionSheet"))
})
.navigationBarTitle(Text("Title"),
displayMode: .inline)
.navigationBarItems(trailing:
Button(action: {
// Works on iPhone, fails on iPad
self.isNavButtonSheetPresented.toggle()
}) {
Text("Show Nav")
}
.actionSheet(isPresented: $isNavButtonSheetPresented,
content: {
ActionSheet(title: Text("ActionSheet"))
})
)
}
.navigationViewStyle(StackNavigationViewStyle())
}
}
最后,这是单击“显示导航”时它在 iPad 上的显示方式:
这是出现此问题的屏幕的简化设置。我将需要保留显示的导航设置,但为清楚起见将它们包括在内。
*** 已更新 ***
虽然这背后的真实应用程序不可能,但我确实删除了 .navigationViewStyle(StackNavigationViewStyle())
设置,这确实使 ActionSheet 出现,尽管在错误的位置,如下所示。
这也会导致通过“显示按钮”访问的按钮的奇怪位置。
是的,这是一个错误,但可能有所不同 - Apple 不允许更改显示的锚点和方向 ActionSheet
,因为它已显示,但始终位于 [= 上的原始控件的右侧26=]。为了证明这一点,只需更改导航中按钮的位置
这里是放置在.leading
位置的例子。测试 Xcode 12 / iOS 14
.navigationBarItems(leading:
Button(action: {
// Works on iPhone, fails on iPad
self.isNavButtonSheetPresented.toggle()
}) {
Text("Show Nav")
}
.actionSheet(isPresented: $isNavButtonSheetPresented,
content: {
ActionSheet(title: Text("ActionSheet"))
})
)
注意:SwiftUI 2.0 .toolbar
的行为方式相同,即。有同样的错误。
首先,我看过一个类似的问题,但它没有解决我的用例。
我的问题是我的 NavigationView
中有一个 NavigationBarItem
,按下时会切换 ActionSheet
。此行为在 iPhone.
但是,当我在 iPad 上使用它时,我屏幕上的两个按钮都会变灰并且没有任何反应。再次单击按钮将使它们处于活动状态(蓝色),但同样不会显示 sheet。
最后,如果我 select 屏幕中间的按钮(显示按钮),则 ActionSheet 会正确显示在 iPad。
我已经用 Xcode 11 & iOS 13.5 和 Xcode 12 & iOS 14 进行了测试。行为没有变化。
import SwiftUI
struct ContentView: View {
@State private var isButtonSheetPresented = false
@State private var isNavButtonSheetPresented = false
var body: some View {
NavigationView {
Button(action: {
// Works on iPad & iPhone
self.isButtonSheetPresented.toggle()
}) {
Text("Show Button")
}
.actionSheet(isPresented: $isButtonSheetPresented,
content: {
ActionSheet(title: Text("ActionSheet"))
})
.navigationBarTitle(Text("Title"),
displayMode: .inline)
.navigationBarItems(trailing:
Button(action: {
// Works on iPhone, fails on iPad
self.isNavButtonSheetPresented.toggle()
}) {
Text("Show Nav")
}
.actionSheet(isPresented: $isNavButtonSheetPresented,
content: {
ActionSheet(title: Text("ActionSheet"))
})
)
}
.navigationViewStyle(StackNavigationViewStyle())
}
}
最后,这是单击“显示导航”时它在 iPad 上的显示方式:
这是出现此问题的屏幕的简化设置。我将需要保留显示的导航设置,但为清楚起见将它们包括在内。
*** 已更新 ***
虽然这背后的真实应用程序不可能,但我确实删除了 .navigationViewStyle(StackNavigationViewStyle())
设置,这确实使 ActionSheet 出现,尽管在错误的位置,如下所示。
这也会导致通过“显示按钮”访问的按钮的奇怪位置。
是的,这是一个错误,但可能有所不同 - Apple 不允许更改显示的锚点和方向 ActionSheet
,因为它已显示,但始终位于 [= 上的原始控件的右侧26=]。为了证明这一点,只需更改导航中按钮的位置
这里是放置在.leading
位置的例子。测试 Xcode 12 / iOS 14
.navigationBarItems(leading:
Button(action: {
// Works on iPhone, fails on iPad
self.isNavButtonSheetPresented.toggle()
}) {
Text("Show Nav")
}
.actionSheet(isPresented: $isNavButtonSheetPresented,
content: {
ActionSheet(title: Text("ActionSheet"))
})
)
注意:SwiftUI 2.0 .toolbar
的行为方式相同,即。有同样的错误。