【问题标题】:Unable to present ActionSheet via a NavigationBarItem in SwiftUI on an iPad无法在 iPad 上的 SwiftUI 中通过 NavigationBarItem 呈现 ActionSheet
【发布时间】:2020-11-02 23:49:46
【问题描述】:

首先,我查看了一个类似的问题,但它没有解决我的用例。

Present ActionSheet in SwiftUI on iPad

我的问题是我的NavigationView 中有一个NavigationBarItem,按下时会切换一个ActionSheet。此行为在 iPhone 上使用时可以正常工作。

但是,当我在 iPad 上使用它时,屏幕上的两个按钮都会变灰,并且什么也没有发生。再次单击按钮将使它们处于活动状态(蓝色),但同样不会显示任何工作表。

最后,如果我选择屏幕中间的按钮(显示按钮),那么 iPad 上会正确显示一个 ActionSheet。

我已经使用 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,尽管在错误的位置,如下所示。

这也会导致通过“显示按钮”访问的按钮位置奇怪。

【问题讨论】:

  • 它就在那里,出于错误原因,他们只是将其显示在右侧。如果您使用.navigationBarItems(leading:,您会看到它。
  • @Asperi 好悲痛。不过谢谢,你是对的。如果你想把它写下来作为答案,我会接受。

标签: ios ipad swiftui ios13 actionsheet


【解决方案1】:

是的,这是一个错误,但可能不同 - Apple 不允许更改显示的 ActionSheet 的锚点和方向,因为它已显示,但始终位于 iPad 上原始控件的右侧。为了证明这一点,改变导航中按钮的位置就足够了

这是放置在.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 的行为方式相同,即。有同样的错误。

【讨论】:

    猜你喜欢
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    相关资源
    最近更新 更多