ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

SwiftUI 父子 UI 组件之间通信 All In One

2022-05-16 23:02:41  阅读:198  来源: 互联网

标签:HStack Bool Text defaultLogo var SwiftUI 组件 UI


SwiftUI 父子 UI 组件之间通信 All In One

demo

//
//  SettingForm.swift
//  BeiJingTourth
//
//  Created by xgqfrms on 2022/5/16.
//

import SwiftUI

struct SettingForm: View {
  @State private var noticeSwitch: Bool = false;
  @State private var bgSwitch: Bool = false;
  @State private var advancedSwitch: Bool = true;
  var developer: String = "xgqfrms";
  var version: String = "v1.0.0";
  var date: String = "2022-01-01";
  var logo: Bool;
  init(_ logo: Bool) {
    self.logo = logo;
  }
  var body: some View {
    Form {
      Section(header: Text("通用设置")) {
        Toggle(isOn: $noticeSwitch) {
          Text("开启消息通知")
        }.onTapGesture {
          // parent.updateLogo($noticeSwitch);
          print("子组件,调用父组件中的方法")
        }
        Toggle(isOn: $advancedSwitch) {
          Text("高级设置")
        }
        Toggle(isOn: $bgSwitch) {
          Text("刷新背景")
        }
      }
      Section(header: Text("通知设置")) {
        if(noticeSwitch) {
          Text("Twitter 通知开启✅")
          Text("Google 通知开启✅")
          Toggle(isOn: $noticeSwitch) {
            Text("通知开启✅")
          }
        } else {
          Text("Twitter 通知关闭❌")
          Text("Google 通知关闭❌")
          Toggle(isOn: $noticeSwitch) {
            Text("通知关闭❌")
          }
        }
      }
      Section(header: Text("高级设置")) {
        if(advancedSwitch) {
          HStack{
            HStack{
              Image(systemName: "person")
              Text("开发: ")
            }
            Spacer()
            Text("\(developer)")
          }
          HStack{
            HStack{
              Image(systemName: "macwindow")
              Text("版本: ")
            }
            Spacer()
            Text("\(version)")
          }
          HStack{
            HStack{
              Image(systemName: "calendar")
              Text("日前: ")
            }
            Spacer()
            Text("\(date)")
          }
        } else {
          Text("已关闭,请开启")
        }
      }
      Section(header: Text("刷新背景设置")) {
        if(bgSwitch) {
          Text("刷新背景开启").task {
            print("开启刷新背景✅")
          }
        } else {
          Text("关闭").task {
            print("关闭刷新背景❌")
          }
        }
      }
    }
  }
}

//struct SettingForm_Previews: PreviewProvider {
//    static var previews: some View {
//        SettingForm()
//    }
//}

//
//  SettingView.swift
//  BeiJingTourth
//
//  Created by xgqfrms on 2022/5/13.
//

import SwiftUI

struct SettingView: View {
  // background 切换 / logo 切换
  @State private var defaultLogo: Bool = true;
  // Cannot declare local wrapped variable in result builder
  // TODO: 子组件,更新父组件中的属性状态,变量值 ???
  func updateLogo(flag: Bool) -> Void {
    // self.defaultLogo.toggle();
    self.defaultLogo = flag;
  }
  // TODO: 子组件,调用父组件中的方法
  var body: some View {
    VStack(alignment: .center, spacing: 0) {
      Image(defaultLogo ? "Beijing-Logo" : "Shanghai-Logo")
        .resizable()
        .scaledToFit()
        .padding(.top)
        .frame(width: 100, height: 100, alignment: .center)
        .shadow(color: Color("ColorLight"), radius: 8, x: 0, y: 4)
      //
      Text("设置 ⚙️")
        .font(.title)
        .fontWeight(.bold)
        .foregroundColor(Color("ColorBrownAdaptive"))
      // Form
      SettingForm(defaultLogo);
      // SettingForm($defaultLogo);
      // Cannot convert value '$defaultLogo' of type 'Binding<Bool>' to expected type 'Bool', use wrapped value instead
      // Remove '$'
    }
    .padding()
    .frame(maxWidth: 640)
  }
}

struct SettingView_Previews: PreviewProvider {
    static var previews: some View {
        SettingView()
    }
}

refs


Flag Counter

©xgqfrms 2012-2020

www.cnblogs.com/xgqfrms 发布文章使用:只允许注册用户才可以访问!

原创文章,版权所有©️xgqfrms, 禁止转载

标签:HStack,Bool,Text,defaultLogo,var,SwiftUI,组件,UI
来源: https://www.cnblogs.com/xgqfrms/p/16278964.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有