SwiftUI:如何使用语义放置来呈现多个ToolbarItem?

n3ipq98p  于 2023-01-04  发布在  Swift
关注(0)|答案(1)|浏览(143)

WWDC 2020 SwiftUI演讲提到了一个新的“.toolbar”修饰符。工具栏根据所使用的设备而变化,工具栏修饰符应该为设备创建适当类型的工具栏。此外,工具栏根据视图的显示方式而变化-即导航到场景还是场景以模态方式呈现?
在下面的Playground代码中,有两个View结构体:第一个称为MainToolbarView,它的显示方式(我相信)就像Playground导航到它一样;第二个称为PresentedView,它是从MainToolbarView以模态方式显示的。

在MainToolbarView中,工具栏的SaveCancel按钮(.navigationBarLeading.navigationBarTrailing)有位置放置。这可以正常工作。点击任一按钮都会导致文本字段显示“保存”或“取消”。

当点击Present Sheet按钮时,第二个视图以模态方式显示。显示的工作表的工具栏存在问题。工具栏对其ConfirmDeny按钮(.confirmationAction.cancellationAction)使用语义放置。但是,仅显示Confirm按钮。
有人能告诉我为什么两个按钮都显示在MainToolbarView上,但只有一个按钮在PresentedView工具栏上吗?我试过改变按钮的顺序,将两个按钮做成一个HStack,甚至尝试使用位置放置。这些选项对我都不起作用。

import SwiftUI
import PlaygroundSupport

struct MainToolbarView: View {

    @State private var buttonIdentifier = "initial state"
    @State private var showSheet = false

    var body: some View {
        NavigationView {
            VStack {
                Spacer()
                Text( $buttonIdentifier.wrappedValue )
                Spacer()
                Button( "Present Sheet" )
                    { showSheet = true }
                Spacer()
            }
            .toolbar {
                ToolbarItem( placement: .navigationBarLeading )
                    { Button( "Save", action: reportSave ) }
                ToolbarItem( placement: .navigationBarTrailing )
                    { Button( "Cancel", action: reportCancel ) }
            }
            .navigationBarTitle( "MAIN" )
        }
        .sheet(isPresented: $showSheet )
            { PresentedView(buttonIdentifier: $buttonIdentifier ) }
    }
    private func reportSave()
    {
        buttonIdentifier = "save"
    }

    private func reportCancel()
    {
        buttonIdentifier = "cancel"
    }
}

struct PresentedView: View {

    // MARK: API
    @Binding var buttonIdentifier: String

    // MARK: instance variables
    @Environment( \.presentationMode ) var mode

    //.confirmationAction

    var body: some View {
        NavigationView {
            Text( "Tap action buttons" )
                .toolbar {
                    ToolbarItem( placement: .confirmationAction )
                        { Button( "Confirm", action: reportConfirm ) }
                    ToolbarItem( placement: .cancellationAction )
                        { Button( "Deny", action: reportDenied ) }
                }
                .navigationBarTitle( "SHEET" )
        }
    }

    private func reportDenied() {
        buttonIdentifier = "sheet denied"
        self.mode.wrappedValue.dismiss()
    }

    private func reportConfirm() {
        buttonIdentifier = "sheet confirmed"
        self.mode.wrappedValue.dismiss()
    }
}

 PlaygroundPage.current.setLiveView( MainToolbarView() )

'

ogq8wdun

ogq8wdun1#

我认为诀窍(对我来说是一个bug)是使用.navigationBarBackButtonHidden(true)修饰符。使用它之后(在.navigationBarTitle( "SHEET" ))下面添加它),我看到了两个按钮。

相关问题