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

SwiftUI @Binding未更新显示警报

基础概念

@Binding 是 SwiftUI 中的一个属性包装器(Property Wrapper),用于在视图之间共享数据。它允许一个视图将其数据绑定到另一个视图的属性上,从而实现数据的实时更新。

优势

  1. 数据驱动:通过 @Binding,可以实现视图的数据驱动更新,减少手动刷新视图的操作。
  2. 解耦@Binding 有助于将视图与其数据源解耦,使得代码更加模块化和易于维护。
  3. 实时更新:当绑定的数据发生变化时,所有绑定到该数据的视图都会自动更新。

类型

@Binding 可以绑定到任何遵循 ObservableObject 协议的对象的属性上。

应用场景

@Binding 常用于以下场景:

  • 表单输入:将表单输入绑定到模型数据。
  • 切换视图:在不同视图之间共享状态。
  • 实时更新:当数据发生变化时,自动更新视图。

问题描述

在使用 @Binding 时,有时会遇到数据更新但视图未更新的情况。

原因

  1. 数据不是 ObservableObject:确保绑定的数据遵循 ObservableObject 协议。
  2. 属性不是 @Published:确保绑定的属性使用了 @Published 属性包装器。
  3. 视图生命周期问题:确保在视图生命周期内正确使用 @Binding

解决方法

以下是一个示例,展示如何正确使用 @Binding

代码语言:txt
复制
import SwiftUI

class DataModel: ObservableObject {
    @Published var value: String = ""
}

struct ContentView: View {
    @StateObject private var model = DataModel()
    
    var body: some View {
        VStack {
            TextField("Enter text", text: $model.value)
                .padding()
            
            Text("You entered: \(model.value)")
                .padding()
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

参考链接

SwiftUI @Binding 官方文档

通过以上示例和解释,你应该能够理解 @Binding 的基础概念、优势、类型、应用场景,并解决未更新显示的问题。

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

相关·内容

@State 研究

Button("改名"){ self.name = "大肘子" } } }} 通过执行上面代码,我们可以发现两个情况: 1.通过使用@State,我们可以在使用...Binding是数据的一级引用,在SwiftUI中作为数据(状态)双向绑定的桥梁,允许在不拥有数据的情况下对数据进行读写操作。...mutating func update()} 工作原理 前面我们说过 @State 有两个作用 1.通过使用@State,我们可以在使用mutating的情况下修改结构中的值2.当状态值发生变化后,...虽然我们在MainView中使用@State声明了date,并且在MainView中修改了date的值,但由于我们并没有在MainView中使用date的值来进行显示或者判断,所以无论我们如何修改date...之所以花气力来判断这个问题,因为这两种创建依赖的时机的不同会导致View更新效率的巨大差异。这个差异也正是我下一篇文章要重点探讨的地方。

2.9K20
  • 干货 | 关于SwiftUI,看这一篇就够了

    UI,否则会引起某些显示问题。...但是,在SwiftUI里面,视图中声明的任何状态、内容和布局,源头一旦发生改变,会自动更新视图,因此,只需要一次布局。在属性前面加上@State关键词,即可实现每次数据改动,UI动态更新的效果。...SwiftUI内部按上述所说的逻辑,判断对应视图是否需要更新UI,最终再次呈现给用户,等待交互; 以上就是SwiftUI的交互流程,其每一个节点之间的数据流转都是单向、独立的,无论应用程序的逻辑变得多么复杂...同时SwiftUI中也是支持frame设定,但也不会像UIKit中那样作用于当前元素,在内部也是形成一个虚拟的View来承载frame设定,在布局过程中进行frame计算最终显示出想要的结果。...五、畅想 SwiftUI不仅为Apple的平台带来了一种新的构建UI的方式,还有全新的Swift编码风格; 可以推断出:SwiftUI会出现很多组件库,方便前端开发; 支持热更新,这一点可能让更多的开发者拥抱

    8.2K11

    SwiftUI:Alert弹窗

    如果发生重要事件,通知用户的一种常见方法是使用警报Alert弹窗-根据您的需要,该弹出窗口包含标题,消息和一个或两个按钮。 但是请考虑一下:何时应该显示警报以及如何显示Alert?...因此,我们不用说“显示警报”,而是创建警报并设置显示警报的条件。...更有趣的是我们如何显示警报:我们不将警报分配给变量,然后编写诸如myAlert.show()之类的东西,因为这将回到旧的“一系列事件”的思维方式。...相反,我们创建一些状态来跟踪警报是否显示,如下所示: @State private var showingAlert = false 然后,我们将警报附加到用户界面的某处,告诉它使用该状态来确定是否显示警报...SwiftUI将观察showingAlert,并在它变为true时立即显示警报

    5.4K20

    SwiftUI:alert() 和 sheet() 与可选值一起使用

    SwiftUI有两种创建警报和表单的方式,到目前为止,我们仅使用一种方法:绑定到布尔值,该布尔值在变为 true 时显示 Alert 或 Sheet。...第二种方法并不经常使用,但是在您需要的时候它确实有用:您可以使用可选的Identifiable对象作为条件,并且当该对象具有值时将显示 Alert 或Sheet 。...= nil 现在,我们可以更改ContentView的body,以便在点击其文本视图时将selectedUser设置为一个值,然后再为selectedUser提供值时使用alert(item:)显示警报...出现提示“Taylor Swift”的警报。解除警报后,SwiftUI会将selectedUser设置为nil。 这似乎是一个简单的功能,但是比其他功能更简单,更安全。...参考 Alert弹窗 SwiftUI:ActionSheet 弹窗 SwiftUI:Sheet 视图 译自 Using alert() and sheet() with optionals

    2.4K40

    SwiftUI中使用UIKit视图

    •updateUIViewSwiftUI会在应用程序的状态(State)发生变化时更新受这些变化影响的界面部分。...在协调器中,我们可以通过双向绑定(Binding),通知中心(notificationCenter)或其他例如Redux模式的单项数据流等方式,将UIKit视图内部的状态报告给SwiftUI框架或其他需要的模块...在右侧的预览中,我们可以看到placeholder可以正常显示,如果你在其中输入文字,表现的状态也同TextField完全一致。...如果按照TextField的正常行为,当我们在其中输入任何文本时,下方的Text中应该显示出对应的内容,不过在我们当前的代码版本中,并没有表现出预期的行为。...} } makeUIView方法的参数中有一个context: Context,通过这个上下文,我们可以访问到Coordinator(自定义协调器)、transaction(如何处理状态更新

    8.2K22

    如何在SwiftUI中实现interactiveDismissDisabled

    目标为: •通过代码控制是否允许手势取消Sheet•在用户使用手势取消Sheet时可以获得通知,进而拥有更多的控制能力 最终实现的效果如下: dismissSheet 当用户有保存的数据时,通过手势取消...在WWDC 2021 观后感[6]一文中,我们已经探讨过SwiftUI3.0将会影响非常多的第三方开发者编写SwiftUI扩展的思路和实现方式。...class SheetDelegate: NSObject, UIAdaptivePresentationControllerDelegate { var isDisable: Bool @Binding...var attempToDismiss: UUID init(_ isDisable: Bool, attempToDismiss: Binding = .constant(UUID...使用了与系统相同的方法名 public extension View{ func interactiveDismissDisabled(_ isDisable:Bool,attempToDismiss:Binding

    3.9K40

    避免 SwiftUI 视图的重复计算

    符合 DynamicProperty 协议的属性包装器 几乎每一个 SwiftUI 的使用者,在学习 SwiftUI 的第一天就会接触到例如 @State、@Binding 这些会引发视图更新的属性包装器...随着 SwiftUI 的不断发展,这类的属性包装器越来越多,已知的有( 截至 SwiftUI 4.0):@AccessibilityFocusState、@AppStorage、@Binding、@Environment...nonmutating set // 只能改动 _location 指向的数据 } public var projectedValue: SwiftUI.Binding {...并且 SwiftUI 会在其变化时自动更新( 重新计算 )对应的视图。 SwiftUI 上有一个困扰了不少人的问题:为什么无法在视图的构造函数中,更改 State 包装的变量值?...与符合 DynamicProperty 协议的属性包装器主动驱动视图更新的机制不同,SwiftUI更新视图时,会通过检查子视图的实例是否发生变化( 绝大多数都由构造参数值的变化导致 )来决定对子视图更新与否

    9.3K81

    SwiftUI 状态管理系统指南

    视图的内部状态,并在该状态被改变时自动使视图更新。...因此,一个Binding标记的属性在给定的视图和定义在该视图之外的状态属性之间提供了一个双向的连接,而Statr和Binding包装的属性都可以通过在其属性名前加上$来作为绑定物传递。...作为一个例子,让我们更新上面定义的ProfileView——通过将管理User模型的责任从视图本身转移到一个新的、专门的对象中。...因此,虽然下面的内容在技术上可能会被编译,但最终会导致运行时的问题——因为当我们的视图在更新时被重新创建,UserModelController实例可能会被删除(因为我们的视图现在是它的主要所有者):...把StateObject和ObservedObject看作是State和Binding的参考类型,或者SwiftUI版本的强和弱属性。

    5.1K20

    SwiftU:将状态绑定到UI控件

    SwiftUI的@State属性包装器允许我们自由修改视图结构体,这意味着当程序更改时,我们可以更新视图属性以匹配。 但是,使用UI控件时,事情会更复杂一些。...但是,该代码不会编译,因为SwiftUI想知道文本字段中的文本存储位置。 请记住,视图是其状态的函数——文本输入框只能在反映存储在程序中的值时显示某些内容。...SwiftUI需要的是结构中的一个字符串属性,它可以显示在文本输入框中,还将存储用户在文本输入框中键入的任何内容。...但是,该代码仍然无法工作,因为Swift需要能够更新name属性以匹配用户在文本字段中键入的任何内容,因此您可以使用`@State``,如下所示: @State private var name = "...Binding state to user interface controls

    2.9K10

    SwiftUI 布局协议 - Part2

    我之前提到过的 LayoutValues 并不局限于传递 CGFloats ,你可以将它用于任何事情,包括Binding,在这个例子中,我们将使用 Binding: struct Rotation...: LayoutValueKey { static let defaultValue: Binding?...此外,在与其他视图布局工作的时候,我们就相当于 SwiftUI 的角色。子布局的任何缓存创建和更新都属于我们的责任,幸运的是,这都很容易处理。我们只需要添加子布局缓存到我们自己的缓存里。...我发现更新路径会产生一个循环,即使该路径被绘制为不影响布局的背景视图也是如此,所以为了避免这种循环,我们要确保路径发生改变,然后才更新绑定,这样就可以成功的打破循环。...如果你制定建议,最小,理想和最大尺寸都将被覆盖。

    2.7K30

    TCA - SwiftUI 的救星?(二)

    不过,除了单纯的“通过状态来更新 UI” 以外,SwiftUI 同时也支持在反方向使用 @Binding 的方式把某个 State 绑定给控件,让 UI 能够不经由我们的代码,来更改某个状态。...在 SwiftUI 中,我们几乎可以在所有既表示状态,又能接受输入的控件上找到这种模式,比如 TextField 接受 String 的绑定 Binding,Toggle 接受 Bool...传统的 SwiftUI 中,我们在通过 $ 符号获取一个状态的 Binding 时,实际上是调用了它的 projectedValue。...捕获这个改变,并对应地更新它,最后再把新的状态再次通过 get 设置给 binding,是开发者需要保证的事情。....binding() 这样一番操作后,我们就可以在 View 里用类似标准 SwiftUI 的做法,使用 $ 取 projected value 来进行 Binding 了: struct MyView

    1.3K50

    SwiftUI数据流之State&Binding

    SwiftUI中,以单一数据源(single source of truth)为核心,构建了数据驱动状态更新的机制。...本篇主要介绍@State和@Binding,将从简单的使用入手,通过一系列具体的代码实例展示它们的使用场景,并进步一探索State的内部实现原理。...@Binding的作用是在保存状态的属性和更改数据的视图之间创建双向连接,将当前属性连接到存储在别处的单一数据源(single source of truth),而不是直接存储数据。...@Binding 修饰属性无需有初始化值,Binding可以配合@State或ObservableObject对象中的值属性一起使用,注意不是@ObservedObject属性包装器 struct Product...传递给子视图FilterView 注释3,子视图FilterView中定义了@Binding var showFavorited: Bool引用传入参数 注释4,当切换开关后,由于@Binding机制的作用

    4.1K30

    GeometryReader :好东西还是坏东西?

    特别是在最近几次 SwiftUI 更新中新增了一些可以替代 GeometryReader 的 API 后,这种观点进一步加强。...这些批评并非全无道理,其中相当一部分已经通过新的 API 在 SwiftUI 版本更新后得到了改善或解决。...对于为什么不采用 Extension 的方式,设计者可能考虑了以下两个因素: 通过 Binding 的方式向上传递信息,并不是当前官方 SwiftUI API 的主要设计方式。...将几何信息传递到上层视图,可能会引起不必要的视图更新。而向下传递信息,可以确保更新只在 GeometryReader 的闭包中进行。 GeometryReader 是布局容器吗,它的布局逻辑是什么?...但实际上,它的显示结果是完全正确的,这就是正确的布局结果。 因此,在这种情况下,通常我们只会使用拥有明确值维度的尺寸( 建议尺寸有值 ),并以此为来计算另一维度的尺寸。

    59970

    从前端视角看 SwiftUI

    虽然不知道 SwiftUI 背后的实作,但背后应该也有类似 diff 机制的东西来达到响应式机制与最小更新的效果。 然而 SwiftUI 的状态管理与 React hooks 仍有差异。...既然采用了类似 redux 的手法,不知道 SwiftUI 是否会遇到与前端开发类似的问题,例如 immutability 确保更新可以被感知;透过优化 subscribe 机制确保 store 更新时只有对应的元件会更新...我还蛮想了解 SwiftUI 背后是怎么计算 diff 的,希望之后有类似的文章出现 @State 修饰符可用来定义元件内部状态,当状态改变时会更新并反映到画面中。...Binding 除了将变数绑定到画面之外,我们也可以将互动绑定到变数之中。...: https://developer.apple.com/documentation/swiftui/binding - EOF -

    3.5K20
    领券