Невозможно представить ActionSheet через NavigationBarItem в SwiftUI на iPad - PullRequest
1 голос
/ 13 июля 2020

Во-первых, я рассмотрел аналогичный вопрос, но он не касается моего варианта использования.

Текущая таблица действий в SwiftUI на iPad

Моя проблема в том, что У меня есть NavigationBarItem в моем NavigationView, который будет переключать ActionSheet при нажатии. Это поведение работает правильно при использовании на iPhone.

Однако, когда я использую это на iPad, обе кнопки на моем экране становятся серыми, и ничего не происходит. Повторное нажатие на кнопки сделает их активными (синие), но опять же, лист не отображается.

Наконец, если я выберу кнопку в середине экрана (Показать кнопку), то таблица действий будет правильно представлена на 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 при нажатии на «Показать навигацию»:

enter image description here

This is a simplified setup for the screen where this issue occurs. I will need to retain the navigation settings shown, but have included them for clarity.

*** UPDATED ***

While it is not possible for the real app behind this, I did remove the .navigationViewStyle(StackNavigationViewStyle()) setting, which did make an ActionSheet appear, although in the wrong spot as seen below.

enter image description here

This also results in bizarre placement for the Button one accessed via "Show Button".

введите описание изображения здесь

1 Ответ

1 голос
/ 14 июля 2020

Да, это ошибка, но, вероятно, другая: 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 ведет себя точно так же, ie. та же ошибка.

...