swiftui - 在不同的视图中使用相同的数据
问题描述
我正在构建一个时钟应用程序。
我试图区分我的观点,但我取得了部分成功。
我可以将我的时钟项目传递给ClockView
.
但是,我不能传递currentTime
给ClockView.
//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
如何正确传递currentTime
from ?ContentView
ClockView
解决方案
这真的取决于您想要实现的目标,但是要将 currentTime 传递给 ClockView,您可以这样做:
在 "ClockView" 设置 "@Binding var currentTime: Time",
在“ContentView”中有“@State var currentTime = Time(min: 0, sec: 0, hour: 0)”
并使用“ClockView(时钟:时钟,当前时间:$ currentTime)”
推荐阅读
- mysql - 在单个mysql查询中将一些金额从一列转移到同一张表的另一列
- java - Google Play 64 位要求
- android - 如何在有限的时间内添加 retryWhen()(例如仅重试 3 次)获取 IOException
- google-optimize - 我们如何在 Google 优化中运行两个 A/B 测试,但只让访问者进入其中一个 a/b 测试?
- sql-server - 将整数字段日期时间转换为日期时间
- ios - 如何在 iOS 中替换通知?
- javascript - 由于 MIME 类型错误,html 视图无法加载 css 样式
- c# - 显示没有服务器名称的相对链接的网站
- c++ - 直接访问基类中的受保护字段
- ruby - Ruby条件和定义?操作员奇怪的行为