首页 > 其他分享 >Swift UI @Binding 代码实现

Swift UI @Binding 代码实现

时间:2023-06-01 12:23:36浏览次数:32  
标签:box 容器 val Binding private UI var Swift

import SwiftUI

final class Box<T> : ObservableObject {
    // 这个注解不加,那就玩死了也不会更新视图
    @Published
    var val: T
    
    init(val: T) {
        self.val = val
    }
}

struct StarRating: View {
    // 个人理解类似Java的Spring容器管理,用更大的容器中的一个小容器来装共享级别更低的
    @EnvironmentObject private var box: Box<Int>
    // @Binding对象的实际类型, @State个人理解是在注解的地方还是原来的对象,只是在传递过去的控件中创建了新的Binding对象
    private var rating: Binding<Int> {
        Binding {
            // 实际存储值的地方
            return box.val
        } set: { newValue in
            // 实际更新值的地方
            box.val = newValue
        }
    }
    private let maxRating = 5
    
    var body: some View {
        HStack {
            ForEach(1..<maxRating + 1, id: \.self) { value in
                Image(systemName: "star")
                    .symbolVariant(value <= rating.wrappedValue ? .fill : .none)
                    .foregroundColor(.accentColor)
                    .onTapGesture {
                        if value != rating.wrappedValue {
                            rating.wrappedValue = value
                        } else {
                            rating.wrappedValue = 0
                        }
                    }
            }
        }
    }
}

struct StarRating_Previews: PreviewProvider {
    static var previews: some View {
        ForEach(1..<6) { val in
            StarRating()
                .environmentObject(Box(val: val))
        }
        
    }
}

参考文档:https://developer.apple.com/tutorials/swiftui-concepts/defining-the-source-of-truth-using-a-custom-binding

 

标签:box,容器,val,Binding,private,UI,var,Swift
From: https://www.cnblogs.com/gabin/p/17448583.html

相关文章

  • python selenium框架解决ip代理框不能自动化登录,解决pyautogui开不了多线程问题
    有时候我们使用python自动化框架的时候,打开一个网页的时候,它会出现出线这一种登录框,我们f12检查不了,用开发者工具强制检查里面没有任何属性.那这时候我们就可以用到python第三方库:pyautoguiPyAutoGUI:是一个Python库,可用于自动化GUI(图形用户界面)程序的任务。它可以让Pytho......
  • layui 日期控件问题
    日期控件正常可弹出,点击返回,设置页面隐藏后,再显示,日期控件不弹出。//返回列表$('#backList').on('click',function(){$('#xxx').hide();$('#yyyy').show();$(window).trigger('resize');});日期控件渲染的时候需要清除lay-key......
  • [email protected] install: `node-gyp rebuild`
    异常:首先检查系统环境变量NODE_PATH值是否设置正常路径下是否有node-gyp包若是没有就执行以下命令npminstall-gnode-gyp......
  • Python 中的 requirement.txt
    目录1.如何使用?requirement.txt导出2.环境混用怎么办?Python也需要维护项目相关的依赖包。通常我们会在项目的根目录下放置一个requirement.txt文件,用于记录所有依赖包和它的确切版本号。requirement.txt的内容长这样:alembic==1.0.10appnope==0.1.0astroid==2.2.5attrs=......
  • burpsuite_pro_v2.0beta 下载和安装使用过程
    burpsuite_pro_v2.0beta使用过程 下载地址:https://pan.baidu.com/s/1mJdRZqSr5A0W9aWEcs3ySg密码:293x  (压缩包内已包含注册机Loader) java8181下载地址:https://repo.huaweicloud.com/java/jdk/8u181-b13/  使用截图: ......
  • ViewFs Guide
    ViewFsGuideViewFsGuideIntroductionTheOldWorld(PriortoFederation)SingleNamenodeClustersPathnamesUsagePatternsPathnameUsageBestPracticesNewWorld–FederationandViewFsHowTheClustersLookAGlobalNamespacePerClusterUsingViewFsPathnameU......
  • 如何定制buildroot文件系统-基于TQ3568开发板
    在日常开发中,经常需要添加应用软件以及自定义的文件来辅助我们开发。因为buildroot不支持apt-get命令,我们需要通过makemenuconfig配置bulidroot文件系统来安装应用。本文档以搭建开发板NFS环境为例,描述如何在buildroot文件系统中添加应用软件。Buildroot添加应用配置开发板NFS服务......
  • 如何使用CheckMenuItem添加可选菜单项
    如何使用CheckMenuItem添加可选菜单项CheckMenuItem也是一种菜单项目,类似CheckBox,拥有可选状态。CheckMenuItem可以添加到菜单中。效果展示示例代码importjavafx.application.Application;importjavafx.scene.Scene;importjavafx.scene.control.CheckMenuItem;imp......
  • 如何使用RadioMenuItem添加单选菜单项
    如何使用RadioMenuItem添加单选菜单项几个RadioMenuItem可以组成一个组合,组合中只能有一个菜单条目被选择。效果展示示例代码importjavafx.application.Application;importjavafx.scene.Scene;importjavafx.scene.control.Menu;importjavafx.scene.control.MenuBar;......
  • Build context
    Buildcontext|DockerDocumentationhttps://docs.docker.com/build/building/context/ Multiple <src> resourcesmaybespecifiedbutthepathsoffilesanddirectorieswillbeinterpretedasrelativetothesourceofthecontextofthebuild.Docker......