SwiftUI:如何在单击 ActionSheet 按钮时呈现新视图?

Posted

技术标签:

【中文标题】SwiftUI:如何在单击 ActionSheet 按钮时呈现新视图?【英文标题】:SwiftUI: How to present new views on clicking ActionSheet button? 【发布时间】:2019-09-20 04:57:16 【问题描述】:

我有一个包含三个操作的操作表

    Action_1 Action_2 取消

如果我点击“Action_1”,我的应用应该显示 ActionView_1()。 如果我点击“Action_2”,我的应用应该显示 ActionView_2()。

我得到这个是为了展示一个视图

.sheet(isPresented: $isAddSecretVisible)ActionView_1().

但这用于通过按钮单击呈现视图。

如果点击 Actionsheet 按钮,我需要相同的操作。 在 SwiftUI

中回答需求

提前致谢。

【问题讨论】:

您可以在 actionSheet 按钮内应用相同的逻辑:iosdevcenters.blogspot.com/2019/09/… 嘿,我更新了我的代码和逻辑below。请看一看。 【参考方案1】:

您应该定义 2 个State,每个对应一个工作表:

@State var isMainActionPresented = false
@State var isActionViewPresented = false

还有一个State 确定女巫actionSheet 出席。所以你可以有一个这样的枚举:

enum ActionViewMode 
    case first
    case second

还有一个辅助扩展:

extension ActionViewMode 
    var view: some View 
        switch self 
            case .first: return ActionView1()
            case .second: return ActionView2()
        
    

然后单击任何ButtonActionSheet.Button,切换所需的状态。查看下面完整的ContentView 代码:

@State var actionViewMode = ActionViewMode.first

@State var isMainActionPresented = false
@State var isActionViewPresented = false

var body: some View 
    Button(action: 
        self.isMainActionPresented = true
    ) 
        Text("ActionSheet")
    
    .actionSheet(isPresented: $isMainActionPresented) 
        ActionSheet(
            title: Text("Title"),
            message: Text("Message"),
            buttons: [
                .default(
                    Text("Action_1"),
                    action: 
                        self.actionViewMode = .first
                        self.isActionViewPresented = true
                ),
                .default(
                    Text("Action_2"),
                    action: 
                        self.actionViewMode = .second
                        self.isActionViewPresented = true
                ),
                .cancel()
        ])
    
    .sheet(isPresented: $isActionViewPresented) 
        self.actionViewMode.view
    

SwiftUI 将处理其余部分。

请注意您不能一个接一个地链接多个工作表,因为每个工作表都会以某种方式覆盖前一个工作表。

【讨论】:

如果您收到错误Function declares an opaque return type, but the return statements in its body do not have matching underlying types,则将您在ActionViewMode 扩展中返回的视图转换为AnyView【参考方案2】:

参考链接:SwiftUI

ActionSheet(title: Text("iOSDevCenters"), message: Text("SubTitle"), buttons: [
            .default(Text("Action_1"), action: 
                                print("Action_1")
                                ActionView_1()
                            ),
            .destructive(Text("Cancel"))
         ])
)

【讨论】:

这不会显示 ActionView_1,只需初始化它。

以上是关于SwiftUI:如何在单击 ActionSheet 按钮时呈现新视图?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:UIAlertController ActionSheet 全屏

保存 swiftUI 的用户凭据 - 密码 ActionSheet 调用

SwiftUI ActionSheet 禁用按钮

如何通过单击 iPhone 故事板中的 ActionSheet 按钮移动到下一个 viewController

SwiftUI macOS currencyFormatter 不更新绑定变量

在 iOS 的 UITabbarcontroller 中添加 Actionsheet