首页 > 解决方案 > 在不同的视图中使用相同的数据

问题描述

我正在构建一个时钟应用程序。

我试图区分我的观点,但我取得了部分成功。

我可以将我的时钟项目传递给ClockView.

但是,我不能传递currentTimeClockView.

//ContentView.swift
import SwiftUI
import SDWebImageSwiftUI

struct ContentView: View {
    
    @State var clocks: [Clock] = []
    
    var width = UIScreen.main.bounds.width
  //@State var currentTime = Time(min: 0, sec: 0, hour: 0)
    @State var receiver = Timer.publish(every: 1, on: .current, in: .default).autoconnect()
    
    var body: some View {
        NavigationView{
            ScrollView {
                LazyVGrid{
                    ForEach(clocks, id: \.id) { clock in
                        Button(action: {
                            print("login tapped")
                        }) {
                            ClockView(clock: clock)   
                          //ClockView(clock: clock, time:Time(min: 0, sec: 0, hour: 0)) this does not work   
                        }
                    }
                    NavigationLink(destination: SubscriptionView(),
                                   isActive: $subscriptionScreenIsActivated){
                    }
                    .frame(width: width / 2, height: width / 2)
                }.padding(15)
            }.navigationTitle("Analog Clocks")
        }.onAppear {
            apiCall().getClocks { (clocks) in
                self.clocks = clocks
            }
        }
        .onReceive(receiver) { (_) in
            let calender = Calendar.current
            
            let min = calender.component(.minute, from : Date())
            let sec = calender.component(.second, from : Date())
            let hour = calender.component(.hour, from : Date())
            
            withAnimation(Animation.linear(duration: 0.01)) {
                
                self.currentTime = Time(min: min, sec: sec, hour: hour)
            }
        }
    }
}
func getTime()->String{
    
    let format = DateFormatter()
    format.dateFormat = "hh:mm a"
    
    return format.string(from: Date())
}

struct Time {
    var min : Int
    var sec : Int
    var hour : Int
}

我想currentTime在以下视图中使用。

//ClockView.swift

import SwiftUI
import SDWebImageSwiftUI

struct ClockView: View {
    var width = UIScreen.main.bounds.width
    var clock: Clock
    
    //    var currentTime = Time

    var body: some View {
        ZStack{
            WebImage(url: URL(string: clock.sec_hand.img))
                .resizable()
                .aspectRatio(contentMode: .fit)
                .frame(width: 32.0, height:width - 370.0)
                .offset(y: (width - 500) / 4)
            //  .rotationEffect(.init(degrees: Double(currentTime.sec) * 6)) //Cannot use currentTime 
        }
        
    }
}

我也试过environmentObject,但也没有用。

//ContentView.swift
ClockView(clock: clock)
      .environmentObject(time: Time(min: 0, sec: 0, hour: 0))

//ClockView.swift
@EnvironmentObject var currentTime: Time

如何正确传递currentTimefrom ?ContentViewClockView

标签: swiftui

解决方案


这真的取决于您想要实现的目标,但是要将 currentTime 传递给 ClockView,您可以这样做:

在 "ClockView" 设置 "@Binding var currentTime: Time",

在“ContentView”中有“@State var currentTime = Time(min: 0, sec: 0, hour: 0)”

并使用“ClockView(时钟:时钟,当前时间:$ currentTime)”


推荐阅读