SwiftUI 4.0(iOS 16)极简实现一个美美哒的多选 Toggle 按钮组

2023-05-16

在这里插入图片描述

概览

在 SwiftUI 4.0 之前,想要实现如下效果的多选/全选 Toggle 按钮组是要写不少行代码滴:

在这里插入图片描述

不过,在 iOS 16 之后我们仅用1行代码即可搞定以上所有!在某些场合下这非常有用哦。

在本篇博文中,我们就来看看如何实现它吧。

Let’s go!!!😉


代码实现

Toggle 是 SwiftUI 中一个非常常用的视图,我们一般将它和某一个布尔状态绑定,以实现状态切换功能:

@State var switchToggleStyle = true

Toggle("Switch样式", isOn: $switchToggleStyle)

从 SwiftUI 4.0 开始,Apple 为 Toggle 组件加入了若干新的构造器:

在这里插入图片描述

我们随便看其中一个:

在这里插入图片描述

可以看到,新的构造器传入一组布尔状态绑定,然后在整个组上操作Toggle。


PS:以下是 WWDC 22 中关于该代码的示例,不过貌似语法已过时,现在已无法编译通过:

在这里插入图片描述


为了能让 Toggle 感知到组的力量,我们只需要将所有状态的绑定打包到组中,然后传入构造器即可:

extension View {
    @ViewBuilder func enableToggleStyle(_ isSwitch: Bool) -> some View {
        
        if isSwitch {
            self.toggleStyle(.switch)
        }else{
            self.toggleStyle(.button)
        }
    }
}

struct ContentView: View {
    
    @State var isSuper = false
    @State var isHuge = false
    @State var isRigid = false
    @State var isSmart = false
    @State var isImmortal = false
    @State var switchToggleStyle = true
    

    var body: some View {
        NavigationStack {
            
            Text("by 大熊猫侯佩")
                .font(.headline)
                .foregroundColor(.gray)
            
            Toggle("Switch样式", isOn: $switchToggleStyle)
            
            Spacer()
            
            DisclosureGroup {
                VStack {
                    Toggle("Super", isOn: $isSuper)
                    Toggle("Huge", isOn: $isHuge)
                    Toggle("Rigid", isOn: $isRigid)
                    Toggle("Smart", isOn: $isSmart)
                    Toggle("Immortal", isOn: $isImmortal)
                }.padding()
            } label: {
                Toggle("无敌的存在!", sources: [
                    $isSuper,
                    $isHuge,
                    $isRigid,
                    $isSmart,
                    $isImmortal,
                ], isOn: \.self)
            }
            .enableToggleStyle(switchToggleStyle)
            .navigationTitle("多选Toggle演示")
            .tint(.pink)
        }
        .padding()
    }
}

效果如下:

在这里插入图片描述

是不是只用一行构造器代码就搞定了所有呢?棒棒哒!!!💯🚀

总结

在本篇博文中,我们在 SwiftUI 4.0 中仅通过一行代码即完成了 Toggle 多选/全选功能,超级简单,小伙伴们不想试一下吗?😎

感谢观赏,再会!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SwiftUI 4.0(iOS 16)极简实现一个美美哒的多选 Toggle 按钮组 的相关文章

  • NSString – 静态还是内联?有性能提升吗?

    如果我写的话会有任何性能提升吗 NSString helloStringWithName NSString name static NSString formatString Hello return NSString stringWith
  • 如何在 Firebase 控制台中使用 Apple 新的 APN .p8 证书

    随着最近 Apple 开发者帐户的升级 我面临着一个困难 在尝试创建推送通知证书时 它为我提供了 p8 证书 而不是可以导出到 p12 的 APNs 证书 Firebase 控制台仅接受 p12 证书 那么我如何从这些新的 p8 证书中获取
  • 如何在 iOS 9 上可靠地检测是否连接了外部键盘?

    在 iOS 9 之前 确定是否连接外部键盘的最可靠方法是监听UIKeyboardWillShowNotification并使文本字段成为第一响应者 如中所述这个问题 https stackoverflow com questions 289
  • 当我输入字符时,SwiftUI 中的 TextField 失去焦点

    当我在文本字段中输入字符时遇到问题 在练习集视图 我必须重新单击文本框才能输入另一个字符 如果我从文本字段中删除绑定 我可以流畅地输入文本 我认为这与我的演讲者班级和更新集函数重新创建一个集合实例 因为我必须替换数组中两层深处的一些值 Co
  • GeoFire Swift 3 - 保存和更新坐标

    我正在尝试使用 GeoFire 将坐标存储到 Firebase 数据库中 我不确定如何更新新坐标 因为它们每秒都会更改 更新 随着childByAutoId 它正在为每辆自行车生成一个新的唯一 ID 如何引用这个唯一的自行车 ID 例如 用
  • 如何使用AudioKit保存音频文件?

    我有音频文件 我给它做了一些效果 let pitchshifter AKPitchShifter self audioPlayer pitchshifter shift 10 AudioKit output pitchshifter 如果我
  • 覆盖层不与 UITableView 一起滚动 - iOS

    我有一个 UITableView 类 它使用以下方法在转到下一个屏幕时调用加载覆盖 问题是这个加载屏幕不随列表滚动 所以如果你滚动一点并单击某些东西 加载屏幕不会显示 因为它位于顶部 如何让加载屏幕始终保持在 UITableView 的顶部
  • 将 SSLSetEnabledCiphers 与 AFNetworking 结合使用来禁用弱密码

    我正在尝试禁用一些密码 弱 例如单个 DES 单个 DES 40 位等 我尝试过使用这段代码在 Cocoa 中使用 CFSocket CFStream 时如何设置 SSL 密码 https stackoverflow com questio
  • 推送动画,没有阴影和停电

    我有一个简单的iOS NavigationController基于应用程序 二UICollectionViews 相继 如果元素打开 第一个合集 被点击时 第二集 将被打开 非常简单 重要的提示 Both UICollectionViews
  • 在 iOS 中,如何创建一个始终位于所有其他视图控制器之上的按钮?

    无论是否呈现模态或用户执行任何类型的转场 有没有办法让按钮在整个应用程序中 始终位于顶部 而不是屏幕顶部 有什么方法可以让这个按钮可拖动并可捕捉到屏幕上吗 我正在以苹果自己的辅助触摸作为此类按钮的示例 您可以通过创建自己的子类来做到这一点U
  • 如何让按钮闪烁?

    我试图在扫描正确时将按钮的颜色 只是闪烁 闪烁 更改为绿色 在出现问题时将按钮的颜色更改为红色 我可以用这样的视图来做到这一点 func flashBG UIView animateWithDuration 0 7 animations s
  • 哪些 Flutter 插件或功能可以利用外部 iOS/Android 显示器来显示与主显示器不同的内容

    我正在构建一个跨平台应用程序 需要在外部显示器上显示不同的视图 通常通过连接到 LCD 投影仪的 HDMI 适配器电缆连接 Flutter 是否能够在内置的外部显示器上显示不同的屏幕 在现有的 Flutter 插件中还是使用现有的 Flut
  • 水平 UICollectionView 单行布局

    我正在尝试使用以下命令设置简单的水平布局UICollectionView 兜圈子却没有达到预期的结果 所以任何指针或例子将不胜感激 我粘贴经常更改的代码但没有成功可能没什么意义 该图像显示两行 第一行是单个项目 尺寸正确并且在中心正确对齐
  • PFQueryTableViewController 错误

    我正在遵循在线教程 使用 Parse 作为后端创建照片共享应用程序 我已经运行了两次教程 两次都从头开始创建应用程序 但在同一位置仍然出现相同的错误 我到处寻找解决方案 但仍然没有运气 我正在使用 PFQueryTableViewContr
  • Xcode 8 / Swift 3:“UIViewController 类型的表达式?未使用”警告

    我有以下函数 它之前编译得很干净 但在 Xcode 8 中生成警告 func exitViewController navigationController popViewController animated true UIViewCon
  • 在 UIScrollview 上显示缩略图的最佳方法是什么(从服务器下载)

    我想在 UIScrollview 如照片应用程序 上显示许多图像 作为缩略图 所有图像将从服务器下载 据我所知 有几种选择 1 通过创建 UIImageviews 然后将它们添加为主滚动视图上的子视图 2 通过子类化一个UIView类 然后
  • SwiftUI 意外地自动弹出 NavigationLink

    我有一个简单的用例 其中一个屏幕使用 NavigationLink 推送另一个屏幕 iOS 14 5 有一个奇怪的行为 即推送的屏幕在被推送后立即弹出 Code NavigationLink destination EmptyView Em
  • Swift:长按手势识别器 - 检测轻击和长按

    我想连接一个动作 如果手势是点击 它会以特定的方式为对象设置动画 但如果按下持续时间超过 0 5 秒 它会执行其他操作 现在 我刚刚连接了动画 我不知道如何区分长按和点击 如何访问新闻持续时间以实现上述目的 IBAction func ta
  • 如何删除 UITableView 中的缩进?

    首先 我对此很陌生 我很可能忘记了一些非常简单的事情 问题 我正在制作一个应用程序 在 a 中显示来自 imgur com 的随机图像tableView 由于某种原因 所有单元格都会缩进少量 如下图所示 我摆弄了许多设置storyboard
  • 如何使用phonegap在iOS应用程序中防止键盘推送webview

    当屏幕底部的输入字段获得焦点时 键盘会向上推我的网络视图 并且页面的上部不再可见 我想防止键盘推高网络视图 有人有主意吗 对焦 设置window scrollTo 0 0 这可以防止键盘完全推高 webview input on focus

随机推荐