首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SwiftUI DatePicker并不总是更新State<Date>变量

SwiftUI DatePicker是一种用户界面控件,用于选择日期和时间。它可以与State<Date>变量结合使用,以便在用户选择日期或时间时更新变量的值。然而,有时候我们会发现,当我们选择一个新的日期或时间时,State<Date>变量并没有得到更新。

这个问题通常是由于DatePicker的工作原理引起的。SwiftUI的DatePicker是基于UIKit的UIDatePicker构建的,而UIDatePicker是使用UIKit的Target-Action模式来处理值的更改的。在SwiftUI中,当我们使用State变量来存储DatePicker的值时,SwiftUI会自动将其转换为Binding类型,并将其传递给UIDatePicker。然而,由于SwiftUI和UIKit之间的桥接,有时候更新并不会正确地传递回State变量。

为了解决这个问题,我们可以使用一个自定义的Binding来替代State<Date>变量。我们可以创建一个计算属性,将DatePicker的值绑定到这个计算属性上,并在计算属性的setter方法中更新State<Date>变量。这样,当我们选择一个新的日期或时间时,State<Date>变量将得到正确的更新。

下面是一个示例代码:

代码语言:txt
复制
struct ContentView: View {
    @State private var selectedDate = Date()
    
    var body: some View {
        VStack {
            DatePicker("Select a date", selection: binding, displayedComponents: .date)
                .datePickerStyle(WheelDatePickerStyle())
                .labelsHidden()
        }
    }
    
    var binding: Binding<Date> {
        Binding<Date>(
            get: { self.selectedDate },
            set: { newValue in
                self.selectedDate = newValue
            }
        )
    }
}

在这个示例中,我们创建了一个名为selectedDate的State<Date>变量,并将其绑定到DatePicker的selection参数上。然后,我们创建了一个名为binding的计算属性,将DatePicker的值绑定到这个计算属性上。在计算属性的setter方法中,我们更新了selectedDate变量的值。

这样,当我们选择一个新的日期时,selectedDate变量将得到正确的更新。我们可以在后续的代码中使用selectedDate变量,以便在应用程序中处理选择的日期。

推荐的腾讯云相关产品:腾讯云云服务器(CVM),腾讯云对象存储(COS)

  • 腾讯云云服务器(CVM):提供可扩展的云服务器实例,可满足各种规模和需求的应用程序。了解更多:腾讯云云服务器(CVM)
  • 腾讯云对象存储(COS):提供安全、稳定、低成本的对象存储服务,适用于存储和处理各种类型的数据。了解更多:腾讯云对象存储(COS)

请注意,以上推荐的腾讯云产品仅供参考,具体选择应根据实际需求进行评估和决策。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 避免 SwiftUI 视图的重复计算

    原文发表于我的博客 肘子的 Swift 记事本 视图状态的构成 可以驱动视图进行更新的源被称之为 Source of Truth,它的类型有: 使用 @State、@StateObject 这类属性包装器声明的变量...符合 DynamicProperty 协议的属性包装器 几乎每一个 SwiftUI 的使用者,在学习 SwiftUI 的第一天就会接触到例如 @State、@Binding 这些会引发视图更新的属性包装器...时,initialValue 仅被保存在 State 实例的内部属性 _value 中,此时,使用 Stae 包装的变量值没有被保存在 SwiftUI 的托管数据池中,并且 SwiftUI 也尚未在属性图中将其作为...当 SwiftUI 将视图从视图树上删除时,会一并完成对 SwiftUI 数据池以及关联的清理工作。如此,使用 State 包装的变量,其存续期将与视图的存续期保持完全一致。...并且 SwiftUI 会在其变化时自动更新( 重新计算 )对应的视图。 SwiftUI 上有一个困扰了不少人的问题:为什么无法在视图的构造函数中,更改 State 包装的变量值?

    9.2K81

    掌握 SwiftUI 的 task 修饰器

    } } }}这段代码将通过 task 修饰器创建一个持续运行的异步任务,每秒更新一次 date 变量,并且在控制台中显示当前的任务 ID 及时间。...app 无法响应是由于当前 task 是在主线程上运行的,如果按照下文中的方法将 task 运行在后台线程之中,那么 app 将可以继续响应,但会在不显示日期文字的情况下,继续更新 date 变量,并且会在控制台持续输出...例如,将上面的计时器代码修改为:struct TimerView: View { @State var date = Date.now @State var show = true var...struct TimerView: View { @State var date = Date.now @State var show = true // 在 StateObject...SwiftUI 对 @State 做了特别的处理,我们可以在任意线程中对其进行安全的修改。

    2.2K30

    掌握 SwiftUI 的 task 修饰器

    } } } } } 这段代码将通过 task 修饰器创建一个持续运行的异步任务,每秒更新一次 date 变量,并且在控制台中显示当前的任务 ID 及时间。...app 无法响应是由于当前 task 是在主线程上运行的,如果按照下文中的方法将 task 运行在后台线程之中,那么 app 将可以继续响应,但会在不显示日期文字的情况下,继续更新 date 变量,并且会在控制台持续输出...例如,将上面的计时器代码修改为: struct TimerView: View { @State var date = Date.now @State var show = true...struct TimerView: View { @State var date = Date.now @State var show = true // 在 StateObject...SwiftUI 对 @State 做了特别的处理,我们可以在任意线程中对其进行安全的修改。

    3.5K60

    SwiftUI 动画进阶 — Part4:TimelineView

    为什么左边的 emoji 会变,而另一个总是悲伤?事实证明, SubView 没有接收到任何变化的参数,这意味着它没有依赖关系。SwiftUI 没有理由重新计算视图的主体。...由于我们需要跟踪这些阶段,我们将使用 @State 变量: pendulumOnLeft: 跟踪钟摆 Pendulum 摆动的方向。...最后一段与 SwiftUI 无关的代码是创建 NSSound 实例。为了避免使示例过于复杂,笔者创建了几个全局变量: let bellSound: NSSound?...使用 onChange 和 onAppear 推进动画,使用 @State 变量来跟踪动画,并设置一个动画,将我们的视图从一个时间线更新过渡到下一个。...两秒后,时间线将更新(例如,由于第一次调度程序更新),触发 onChange 关闭。这将反过来改变标志变量

    3.8K30

    @State 研究

    本文试图探讨并分析SwiftUI 中 @State的实现方式和运行特征;最后提供了一个有关扩展@State功能的思路及例程。读者需要对SwiftUI的响应式编程有基本概念。...之所以说是半成品,因为尽管我们也遵循了DynamicProperty协议,但我们自己编写的这段代码并不能和视图建立依赖。...之所以花气力来判断这个问题,因为这两种创建依赖的时机的不同会导致View更新效率的巨大差异。这个差异也正是我下一篇文章要重点探讨的地方。...本文我们自己通过代码打造的@State半成品并不能创建和视图的依赖,我们如何才能完成这种依赖关联的创建? @State不仅可以被用于对属性的包装,同时State本身也是一个标准的结构体。...State属于SwiftUI架构,ObservableObject属于Combine架构,SwiftUI明显对于State的优化要好于ObservableObject。

    2.9K20

    SwiftUI @State @Published @ObservedObject 深入理解和使用

    @State 介绍 因为SwiftUI View 采用的是结构体,当创建想要更改属性的结构体方法时,我们需要添加mutating关键字,例如: mutating func doSomeWork() 然而...@State允许我们绕过结构体的限制:我们知道不能更改它们的属性,因为结构是固定的,但是@State允许SwiftUI将该值单独存储在可以修改的地方。...提示:在SwiftUI中存储程序状态有几种方法,您将学习所有这些方法。@State是专门为存储在一个视图中的简单属性而设计的。...@Published private var _lastUpdateTime: Date = Date() /// /// 通知更新 public func notifyUpdate...() { _lastUpdateTime = Date() } } /// 那当我们 包装类下的对象更新的时候 /// 可以直接 调用包装类 notifyUpdate() 方法更新当前对象属性

    3.1K10

    Ask Apple 2022 与 SwiftUI 有关的问答(上)

    本文对本次活动中与 SwiftUI 有关的一些问答进行了整理,并添加了一点个人见解。本文为上篇。访问我的博客 www.fatbobman.com[1] 可以获得更好的阅读体验以及最新的更新内容。...contextMenu_2022-10-26_14.01.21.2022-10-26 14_02_29如何对 @State 变量进行测试Q:对于测试 SwiftUI 视图中的 @State 变量是否有推荐的方式...只有将这些变量重构到视图模型中去这一种方式?A:如果在同一个视图中,有多个相互关联的 @State 属性,将他们提取到一个结构中或许是好的选择。...SwiftUI 4.0 中,WindowGroup 获得了相当大的更新,真正具备了开发 macOS 应用的能力。...我知道 @State 应该是一个内部值,但在某些情况下,我们需要从外部传入一个值,这对于 onAppear 似乎并不可行。下面的方法由于某种原因并不总是有效。

    12.2K20

    React 基础实例教程

    this.state,而props初始化则需要在外部进行 再看看点击事件,会发现输出的this为null,因在ES6的类形式中,React并不会自动绑定函数方法的this对象,需要自行绑定 一般来说,有三种绑定方式...== this.state.name;取消注释,则不再被更新渲染 ?...document.getElementById('box')); 初始在InputItem中设置了defaultValue为空,一段时间后获取到父Page传来的新值inputValue,然而InputItem中的defaultValue并不更新...在使用一些插件的时候可能会遇到问题,如日期插件bootstrap-datepicker class DatePicker extends React.Component { constructor...')); 且看看这个timeFrom,假设现在的需求是选择的日期不能大于15号 正常情况下,直接调用.datepicker('update', '');清空即可 但在React受控组件中,这关乎状态state

    4.4K20

    SwiftUI-数据流

    5.1 的新特性 Property Wrapper来实现的一种属性装饰语法糖(修饰器/装饰器) Property 这种形式最简单,就是在 View中定义常量或者变量,然后在内部使用 import SwiftUI...struct ContentView: View { // 用@State修饰需要改变的变量 @State private var count: Int = 0 var...VS @Binding @State只能在当前修饰的属性改变时会触发UI刷新,所以很适合值类型,因为对值类型里面属性的更新,也会触发整个值类型的重新设置。...不过值类型在传递时会发生复制操作,所以给传递后的值类型即使属性更新了也不会触发最初的传过来的值类型的重新赋值,所以界面并不会刷新,此时需要用@Binding,因为它可以将值类型转为引用类型,这样在传递时...ObservableObject 在应用开发过程中,很多数据其实并不是在 View 内部产生的,这些数据有可能是一些本地存储的数据,也有可能是网络请求的数据,这些数据默认是与 SwiftUI 没有依赖关系的

    10.1K20

    TCA - SwiftUI 的救星?(一)

    我们类比一下这些步骤在 SwiftUI 中的实现,可以发现步骤 4 其实已经包含在 SwiftUI 中了:当 @State 或 @ObservedObject 的 @Published 发生变化时,SwiftUI...我们总是可以通过把小部件的 Feature 整体一起,组合形成更大的 Feature 或是添加到其他 Feature 上去,形成一组更大的功能。...上例中,store.send(.increment) 所对应的 State 变更,应该是 count 增加一,因此在 send 方法提供的闭包部分,我们正确更新state 作为最终状态。...如果让 View 直接观察整个 Store,在其中某个状态发生变化时,SwiftUI 将会要求所有对 Store 进行观察的 UI 更新,这会造成所有的 view 都对 body 进行重新求值,是非常大的浪费...比如下图中,State 2 发生了变化,但是并不依赖 State 2 的 View 1 和 View 1-1 只是因为观察了 Store,也会由于 @ObservedObject 的特性,重新对 body

    3.2K30

    Ask Apple 2022 与 SwiftUI 有关的问答(下)

    本文对本次活动中与 SwiftUI 有关的一些问答进行了整理,并添加了一点个人见解。本文为下篇。访问我的博客 www.fatbobman.com[1] 可以获得更好的阅读体验以及最新的更新内容。...任何标记 @Published 的变量都应该在主线上被修改,所以应该使用 @MainActor 。但任何触及该属性的代码都将被影响。是否有建议的标准模式或方法来改善这一点?...在使用引用类型时,这一点尤其重要,因为你必须确保总是有对它进行序列化的读取。...因为这些使用并不有害,我们不希望开发者因为使用了新的编译器版本而处理一堆的警告。...)调用 transformAnchorPreference(key:_, value:_, transform:_) or preference(key:_,value:_) 来在 SwiftUI 更新视图时收集坐标信息调用

    14.8K30

    一段因 @State 注入机制所产生的“灵异代码”

    与之不同的是,针对值类型的主要注入手段 @StateSwiftUI 则为其实现了高度的优化机制( EnvironmentValue 没有提供优化,行为与引用类型注入行为一致 )。...这意味着,即使我们在定义视图的结构体中声明了使用 @State 标注的变量,但只要 body 中没有使用该属性( 通过 ViewBuilder 支持的语法 ),即使该属性发生变化,视图也不会刷新。...当在 Text 中添加 n 的引用后,每次 n 值发生变化,都将引发视图更新。...开始调用 .fullScreenCover 的闭包,创建 Sheet 视图尽管 show 也是通过 State 声明的,但 show 的变化并不会导致 ContextView 重新更新。...这是因为在 .fullScreenCover 的构造方法中,我们传递的是 show 的 projectedValue( Binding 类型 )由于合并操作的原因,在 Sheet 视图关联到 n 后,并不会重新更新

    1.9K20
    领券