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

在ObservedObject公共变量更新期间,SwiftUI选取器在滚动时跳转

是因为在更新ObservedObject公共变量时,SwiftUI会重新渲染视图。当选取器处于滚动状态时,由于视图重新渲染,选取器的状态也会被重置,导致滚动位置的跳转。

为了解决这个问题,可以使用StateObject或EnvironmentObject来管理选取器的状态,而不是使用ObservedObject。StateObject和EnvironmentObject都是SwiftUI中用于管理视图状态的属性包装器。

StateObject用于管理视图内部的局部状态,而EnvironmentObject用于在整个应用程序中共享状态。通过将选取器的状态存储在StateObject或EnvironmentObject中,即使ObservedObject公共变量更新,选取器的状态也会保持不变,从而避免滚动时的跳转问题。

以下是一个示例代码,演示如何使用StateObject来管理选取器的状态:

代码语言:txt
复制
import SwiftUI

class SelectionManager: ObservableObject {
    @Published var selectedIndex: Int = 0
}

struct ContentView: View {
    @StateObject private var selectionManager = SelectionManager()

    var body: some View {
        ScrollView {
            VStack {
                ForEach(0..<100) { index in
                    Text("Item \(index)")
                        .padding()
                        .background(selectionManager.selectedIndex == index ? Color.blue : Color.clear)
                        .onTapGesture {
                            selectionManager.selectedIndex = index
                        }
                }
            }
        }
    }
}

在上面的示例中,我们创建了一个SelectionManager类来管理选取器的状态。在ContentView中,我们使用@StateObject将SelectionManager实例化,并将其作为参数传递给选取器。当选取器被点击时,我们更新SelectionManager的selectedIndex属性,从而更新选取器的状态。

这样,即使ObservedObject公共变量更新,选取器的状态也会保持不变,滚动时不会发生跳转。

关于腾讯云相关产品和产品介绍链接地址,由于要求不能提及具体品牌商,建议您参考腾讯云的官方文档和网站,了解他们提供的云计算相关产品和服务。

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

相关·内容

StateObject 与 ObservedObject

StateObject 是 SwiftUI 2.0 中才添加的属性包装,它的出现解决了某些情况下使用 ObservedObject 视图会出现超预期的问题。...ObservedObject 视图的存续期间只保存了订阅关系,而 StateObject 除了保存了订阅关系外还保持了对可观察对象的强引用。...由于实例是会反复创建的,因此,开发者必须用特定的标识( @State、@StateObject 等 )告诉 SwiftUI ,某些状态是与视图存续期绑定的,存续期期间是唯一的。...对于数据的准备工作,可以使用 onAppear 或 task ,视图加载进行。总结StateObject 和 ObservedObject 是我们经常会使用的属性包装,它们都有各自擅长的领域。...我正以聊天室、Twitter、博客留言等讨论为灵感,从中选取有代表性的问题和技巧制作成 Tips ,发布 Twitter 上。

2.4K20

SwiftUI-数据流

装饰) Property 这种形式最简单,就是 View中定义常量或者变量,然后在内部使用 import SwiftUI struct Model { var title: String...不过值类型传递时会发生复制操作,所以给传递后的值类型即使属性更新了也不会触发最初的传过来的值类型的重新赋值,所以界面并不会刷新,此时需要用@Binding,因为它可以将值类型转为引用类型,这样传递...ObservableObject 应用开发过程中,很多数据其实并不是 View 内部产生的,这些数据有可能是一些本地存储的数据,也有可能是网络请求的数据,这些数据默认是与 SwiftUI 没有依赖关系的...数据流图 从上图可以看出SwiftUI 的数据流转过程: 用户对界面进行操作,产生一个操作行为 action 该行为触发数据状态的改变 数据状态的变化会触发视图重绘 SwiftUI 内部按需更新视图,...最终再次呈现给用户,等待下次界面操作 注意 SwiftUI 中,开发者只需要构建一个视图可依赖的数据源,保持数据的单向有序流转即可,其他数据和视图的状态同步问题 SwiftUI 帮你管理,所以 ViewController

10.2K20
  • WWDC 23 之后的 SwiftUI 有哪些新功能

    之前的 SwiftUI 框架版本中,应该使用 @ObservedObject 属性包装来订阅更改。现在不需要了,因为 SwiftUI 视图会自动跟踪符合 Observable 协议的类型的更改。...动画 动画始终是 SwiftUI 框架中最重要的部分。 SwiftUI 中轻松实现任何动画,但之前的框架版本缺少一些现在具有的功能。...每当用户滚动视图,它会通过设置第一个可见视图的标识来更新绑定。...还可以通过编程方式滚动到任何视图,但是,应该使用 scrollTargetLayout 视图修饰符来告诉 SwiftUI 框架在哪里查找标识以更新绑定。...它允许滚动视图中启用分页。 搜索 与搜索相关的视图修饰符也有一些很好的新增功能。例如,可以通过编程方式聚焦到搜索字段。

    38120

    避免 SwiftUI 视图的重复计算

    SwiftUI 将视图从视图树上删除,会一并完成对 SwiftUI 数据池以及关联的清理工作。如此,使用 State 包装的变量,其存续期将与视图的存续期保持完全一致。...并且 SwiftUI 会在其变化时自动更新( 重新计算 )对应的视图。 SwiftUI 上有一个困扰了不少人的问题:为什么无法视图的构造函数中,更改 State 包装的变量值?...ObjectWillChangePublisher )关联起来,该 Publisher 发送数据更新视图。...与符合 DynamicProperty 协议的属性包装主动驱动视图更新的机制不同,SwiftUI 更新视图,会通过检查子视图的实例是否发生变化( 绝大多数都由构造参数值的变化导致 )来决定对子视图更新与否...例如:当 SwiftUI 更新 ContentView ,如果 SubView 的构造参数( name 、age )的内容发生了变化,SwiftUI 会对 SubView 的 body 重新求值(

    9.3K81

    探讨 SwiftUI 中的几个关键属性包装

    在这篇文章中,我们将探讨几个 SwiftUI 开发中经常使用且至关重要的属性包装。本文旨在提供对这些属性包装的主要功能和使用注意事项的概述,而非详尽的使用指南。...@State @State 是 SwiftUI 中最常用的属性包装之一,主要用于视图内部管理私有数据。它特别适合存储值类型数据,如字符串、整数、枚举或结构体实例。...属性包装本质上是一个结构体。使用 @ 前缀,它用于包装其他数据;而不带 @ ,表示其自身类型。...@ObservedObjectSwiftUI 中用于为视图与 ObservableObject 实例之间创建关联的属性包装,主要用于视图存续期内引入外部的 ObservableObject...引入第三方提供的符合 ObservableObject 实例,应确保 @ObservedObject 引用的对象整个视图的生命周期中都是可用的,否则可能导致运行时错误。

    32410

    SwiftUI 状态管理系统指南

    视图的内部状态,并在该状态被改变自动使视图更新。...因此,虽然下面的内容在技术上可能会被编译,但最终会导致运行时的问题——因为当我们的视图更新被重新创建,UserModelController实例可能会被删除(因为我们的视图现在是它的主要所有者):...观察和修改环境变量 最后,让我们来看看SwiftUI的环境系统如何被用来两个互不直接连接的视图之间传递各种状态。...尽管一个父视图和它的一个子视图之间创建绑定通常很容易,但在整个视图层次结构中传递某个对象或值可能相当麻烦——而这正是环境变量旨在解决的问题类型。 有两种主要的方法来使用SwiftUI的环境。...小结 SwiftUI管理状态的方式绝对是该框架最有趣的方面之一,它可能需要我们稍微重新思考数据应用中的传递方式——至少涉及到将被我们的UI直接消费和修改的数据是这样。

    5.1K20

    解析SwiftUI布局细节(二)循环轮播+复杂布局

    苹果给的 SwiftUI 的使用例子中就是这样写的,当然我们正常的使用中这样写也没啥问题,那我们界面跳转的问题是什么呢?...)这个是需要特别说明的一个变量,从名字上可以看出,这个修饰符是针对全局环境的。...通过它我们可以避免初始 View 创建 ObservableObject, 而是从环境中获取 ObservableObject,像 @EnvironmentObject,@ObservedObject...3、再提一点关于上面说的滚动视图,UIKit中我们可以用UICollectionView搞定一切,但是SwiftUI中没有这个控件,我建议采用的方式是 ScrollView + HStack + VStack...区别于我们UIKit的创建方式,SwiftUI对它进行了简化,具体的创建如下: /// SwiftUI对定时的简化,可以进去看看具体参数的定义 private let timer = Timer.publish

    12.1K20

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

    @State 介绍 因为SwiftUI View 采用的是结构体,当创建想要更改属性的结构体方法,我们需要添加mutating关键字,例如: mutating func doSomeWork() 然而...@State允许我们绕过结构体的限制:我们知道不能更改它们的属性,因为结构是固定的,但是@State允许SwiftUI将该值单独存储可以修改的地方。...提示:SwiftUI中存储程序状态有几种方法,您将学习所有这些方法。@State是专门为存储一个视图中的简单属性而设计的。...因为SwiftUI更新数据的前提是触发 第一层 绑定的对象 wrapperModel下的属性(字段)发生更新才会调用视图层更新数据 但是 第一次下绑定的对象还绑定了 @ObservedObject 或者其他类型的对象呢...{ /// /// 注意 /// 接收 子类model 时候要用 @ObservedObject 不能用 @Published /// 因为SwiftUI 更新机制是当前对象有

    3.2K10

    SwiftUI + Core Data App 的内存占用优化之旅

    当子视图进入惰性容器的可视区域SwiftUI 会调用它的 onAppear 闭包,子视图退出可视区域,会调用 onDisappear 闭包。...我们可以通过 onAppear 以及 onDisappear 中对图片的显示与否( 变量 show )进行控制( 迫使 SwiftUI 对视图的 body 重新求值 ),从而减少因上述原因所增加的内存占用...它保证了,只真正对数据有需求,才对数据进行获取( 实例化 )。提高了性能的同时,也尽量减少了对内存的占用。 本例中,只有视图首次出现在 List 的可视区域,Item 才会被填充数据。...数据的多份拷贝 当图片数据从 SQLite 经 Core Data 最终通过 SwiftUI 显示,实际上在内存中至少保存了三份拷贝: 行缓存 托管对象上下文( 托管对象被填充后 ) 显示该图片的 SwiftUI...即使我们 onDisappear 中将该变量设置为 nil,但 SwiftUI 并没有释放之前它所占用的空间。

    1.3K10

    SwiftUI + Core Data App 的内存占用优化之旅

    当子视图进入惰性容器的可视区域SwiftUI 会调用它的 onAppear 闭包,子视图退出可视区域,会调用 onDisappear 闭包。...我们可以通过 onAppear 以及 onDisappear 中对图片的显示与否( 变量 show )进行控制( 迫使 SwiftUI 对视图的 body 重新求值 ),从而减少因上述原因所增加的内存占用...它保证了,只真正对数据有需求,才对数据进行获取( 实例化 )。提高了性能的同时,也尽量减少了对内存的占用。 本例中,只有视图首次出现在 List 的可视区域,Item 才会被填充数据。...数据的多份拷贝 当图片数据从 SQLite 经 Core Data 最终通过 SwiftUI 显示,实际上在内存中至少保存了三份拷贝: 行缓存 托管对象上下文( 托管对象被填充后 ) 显示该图片的 SwiftUI...即使我们 onDisappear 中将该变量设置为 nil,但 SwiftUI 并没有释放之前它所占用的空间。

    2.4K40

    @State 研究

    @State如何工作的 分析@State如何工作之前,我们需要先了解几个知识点 属性包装 作为swift 5.1的新增功能之一,属性包装管理属性如何存储和定义属性的代码之间添加了一个分割层。...我推测@State同视图的依赖是ViewBuilder解析进行的。编译解析我们的body,会判断date的数据变化是否会对当前视图造成改变。如果没有则不建立依赖关联。...我们可以用另一段代码来分析编译ObservedObject 的反应。...由此可以推测,SwiftUI对于ObservedObject采用了不同的依赖创建时机,只要声明,无论body里是否有需要,ObservableObject的objectWillChange产生send...因此ObservedObject很可能是初始化MainView的时候建立的依赖关系。 之所以花气力来判断这个问题,因为这两种创建依赖的时机的不同会导致View更新效率的巨大差异。

    2.9K20

    SwiftUI数据流之State&Binding

    SwiftUI中,以单一数据源(single source of truth)为核心,构建了数据驱动状态更新的机制。...struct的拷贝,所以其中一个View的struct值发生变化,对另一个没有影响;反之,如果是class则会互相影响; 当User是一个结构体,每次我们修改这个结构体的属性,Swift实际上是创建一个新的结构体实例...@Binding 修饰属性无需有初始化值,Binding可以配合@State或ObservableObject对象中的值属性一起使用,注意不是@ObservedObject属性包装 struct Product...,anotherFlag是没有使用属性包装的普通变量,同时增加了一个mutating的方法changeAnotherFlag被设计修改anotherFlag; body中通过几种方式对两个变量进行修改...关键字向编译表明,这个赋值过程不会修改这个struct本身,而是修改其他变量

    4.1K30

    SwiftUI:使用 @EnvironmentObject 从环境中读取自定义值

    您已经了解了如何使用@State处理单个视图的局部状态,以及@ObservedObject如何使我们视图之间传递一个对象,以便我们可以共享它。...Apple已将此工作表情况描述为他们想要修复的错误,因此我希望以后对SwiftUI更新中会有所改变。...向您展示一些代码之前,还有最后一件事:环境对象使用您已经学过的ObservableObject协议,SwiftUI将自动确保共享同一环境对象的所有视图更改时都会更新。...这些将使用@EnvironmentObject属性包装来表示此数据的值来自环境,而不是本地创建: struct EditView: View { @EnvironmentObject var...当然,我们可以单个视图中表示出来,但是通过这种方式,您可以确切地看到使用环境对象通信的无缝性。 现在,这是最聪明的部分。

    9.7K20
    领券