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

如何允许在SwiftUI中创建新对象的按钮不在重新加载时创建对象?

在SwiftUI中,可以通过使用@State属性包装器来实现在重新加载视图时不重新创建对象的按钮。@State属性包装器用于在视图之间存储和管理状态。当状态发生变化时,SwiftUI会自动更新视图。

以下是在SwiftUI中创建新对象的按钮不重新加载时创建对象的步骤:

  1. 创建一个遵循View协议的自定义视图结构体。
  2. 在视图结构体中声明一个使用@State属性包装器的变量,用于存储对象。
  3. 在视图结构体的body属性中,使用Button视图创建一个按钮,并将按钮的操作与创建新对象的代码相关联。
  4. 在按钮的操作中,通过修改@State属性包装器的变量来更新对象。
  5. 在视图结构体的body属性中,使用NavigationLink视图创建一个导航链接,以便在点击按钮后导航到新对象的详细信息页面。

以下是一个示例代码,演示如何在SwiftUI中创建新对象的按钮不重新加载时创建对象:

代码语言:txt
复制
import SwiftUI

struct ContentView: View {
    @State private var newObject: Object? = nil
    
    var body: some View {
        NavigationView {
            VStack {
                Button(action: {
                    self.newObject = Object()
                }) {
                    Text("Create New Object")
                }
                
                NavigationLink(destination: ObjectDetailView(object: newObject), isActive: Binding<Bool>(
                    get: { self.newObject != nil },
                    set: { if !$0 { self.newObject = nil } }
                )) {
                    EmptyView()
                }
            }
        }
    }
}

struct Object {
    // Object properties
}

struct ObjectDetailView: View {
    let object: Object?
    
    var body: some View {
        if let object = object {
            Text("Object Detail: \(object)")
        } else {
            Text("No Object Selected")
        }
    }
}

在上述示例代码中,ContentView是一个遵循View协议的自定义视图结构体。它包含一个使用@State属性包装器的newObject变量,用于存储新对象。当点击按钮时,newObject变量会更新,并通过NavigationLink导航到ObjectDetailView视图,显示新对象的详细信息。

请注意,这只是一个示例,你可以根据自己的需求进行修改和扩展。

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

相关·内容

Java,一个对象如何创建?又是如何被销毁

Java,一个对象创建涉及以下步骤:内存分配:当使用关键字new调用一个类构造方法,Java虚拟机会在堆中分配一块内存空间来存储该对象。...调用构造方法:在对象实例变量初始化后,Java虚拟机会调用类构造方法。构造方法是一种特殊方法,用于执行一些针对对象初始化操作。构造方法可以带有参数,以便在创建对象传递初始值。...对象生命周期一般包括以下几个阶段:创建阶段:Java,通过使用关键字new来创建一个对象。在这个阶段,对象会被分配在堆上,并初始化为默认值。...终结阶段:Java,提供了一个finalize()方法,这个方法在对象即将被垃圾回收被调用。开发者可以重写这个方法,定义对象在被销毁之前需要执行清理操作。...总结:对象Java通过垃圾回收机制进行销毁,对象生命周期包括创建、使用、不可达、终结和垃圾回收阶段。可以通过重写finalize()方法来定义对象销毁之前需要执行清理操作。

38151

如何结合 Core Data 和 SwiftUI

设置核心数据需要两个步骤:创建所谓持久性容器(从容器存储中加载并保存实际数据),然后将其注入 SwiftUI 环境,以便我们所有的视图都可以访问它。 Xcode 模板已经为我们完成了这两个步骤。...如果我们对 Core Data 说“这不是必须”(您可以模型编辑器完成),它仍然会生成可选 Swift 属性,因为所有 Core Data 关心是属性保存具有值——在其他时间它们可以为 nil...为了解决这个问题,我们将在列表下方创建一个按钮,每次点击都会添加一个随机学生,但是首先我们需要一个属性来存储托管对象上下文。 让我重申一下,因为这很重要。...我们无法代码中看到该类,因为它是构建项目自动生成,就像 Core ML 模型一样。...这是一个引发函数调用,因为理论上它可能会失败。实际上,我们所做一切都没有失败可能,因此我们可以使用try?来调用它——–我们不在乎捕获错误。 因此,请将最后一行添加到按钮操作: try?

11.8K30

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

@State允许我们绕过结构体限制:我们知道不能更改它们属性,因为结构是固定,但是@State允许SwiftUI将该值单独存储可以修改地方。...但是相信我,这是值得:随着你进步,你会了解到SwiftUI经常破坏和重新创建结构体,所以保持它们小而简单结构对性能很重要。...提示:SwiftUI存储程序状态有几种方法,您将学习所有这些方法。@State是专门为存储一个视图中简单属性而设计。...@Published + @ObservedObject 介绍 @Published是SwiftUI最有用包装之一,允许我们创建出能够被自动观察对象属性,SwiftUI会自动监视这个属性,一旦发生了改变...(代码注释部分最为主要,务必看完) 虽然上面案例运行什么都正常展示加载,但是到了实际项目中,却一堆bug,这是如何导致,如果对 这三种状态跟View绑定关系不了解,很可能给自己留下隐患 先来看组案例

3K10

SwiftUI数据流之State&Binding

SwiftUI,以单一数据源(single source of truth)为核心,构建了数据驱动状态更新机制。...struct拷贝,所以其中一个Viewstruct值发生变化,对另一个没有影响;反之,如果是class则会互相影响; 当User是一个结构体,每次我们修改这个结构体属性,Swift实际上是创建一个结构体实例...@State能够发现这个变化,并自动重新加载我们视图。现在如果改为class,我们有了一个类,这种行为就不再发生,Swift可以直接修改值。...如果User是一个类,属性本身就不会改变,所以@State不会注意到任何东西,也无法重新加载视图。即使类内某个属性值发生变化,但@State不监听这些,所以视图不会被重新加载。...) ▿ some: SwiftUI.StoredLocation #0 注意user地址发生了变化,开始创建user被销毁又重新创建

4K30

避免 SwiftUI 视图重复计算

SwiftUI 将视图加载到视图树,通过调用 _makeProperty 完成将数据保存到托管数据池以及属性图中创建关联操作,并将数据托管数据池中引用保存在 _location ( AnyLocation...,ObservedObject 并不会在 SwiftUI 托管数据池中保存引用对象实例( @StateObject 会将实例保存在托管数据池中 ),仅会在属性图中创建视图与视图类型实例引用对象...@ObservedObject var store = Store() // 每次创建视图类型实例,都会重新创建 Store 实例 由于 SwiftUI 会不定时地创建视图类型实例( 非加载视图 ),...每次创建过程都会重新创建一个引用对象,因此假设使用上面的代码( 用 @ObservedObject 创建实例 ),让 @ObservedObject 指向一个不稳定引用实例,很容易出现一些怪异现象...会在主线程上运行触发器闭包,如果闭包操作比较昂贵,可以考虑将闭包发送到后台队列 总结 本文介绍了一些 SwiftUI 如何避免造成视图重复计算技巧,除了从中查找是否有能解决你当前问题方法外

9.2K81

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

创建从底部开始滚动视图Q:我如何实现一个底部对齐滚动视图, macOS 上会不会有糟糕性能?...TextField 内容验证Q:如何实现一个只接受数字 SwiftUI TextField,小数是允许。A:向文本字段提供 FormatStyle 以实现自动将文本转换为各种数字。...macOS APIQ:对于运行 Monterey Mac,能否如何SwiftUI 实现下面需求建议:打开一个窗口该窗口中初始化数据找到所有打开窗口确定一个窗口是否打开从不在该窗口视图中关闭一个窗口...Too complex to type checkQ:我 iOS 14 SwiftUI 遇到一个问题,我试图有条件地显示 3 个符合 Shape 协议对象一个。...然后用 SwiftUI Image 来加载,data 还挺大,当多个图同时加载,会卡顿和内存占用,请问这种情况下怎么改善A:首先尽量保证采用异步加载方式加载创建图片,比如 SwiftUI AsyncImage

14.7K30

【visionOS】从零开始创建第一个visionOS程序

这样才可以使用SwiftUI创建应用,充分利用visionOS中提供沉浸感。...在身临其境体验,使用ARKit将你内容与人周围环境整合起来。 页面链接探索交互方式 人们可以通过看着一个元素并轻敲手指来选择它。他们还可以使用特定手势来缩放、拖动、缩放和旋转对象。...创建Xcode投影页面链接 Xcode中选择File >比;项目。导航到模板选择器visionOS部分,并选择App模板。当出现提示,为项目指定一个名称以及其他选项。...当你准备界面显示3D内容,使用RealityView。这个SwiftUI视图作为你RealityKit内容容器,并允许你使用熟悉SwiftUI技术更新内容。...系统显示时间设置每个窗口和音量初始位置。系统还增加了一个窗口条,允许用户重新定位窗口或调整窗口大小。

70540

AVKit框架详细解析(四) —— 基于AVKit 和 AVFoundation框架视频流App构建

在此过程,您将学习 AVKit 和 AVFoundation 框架基础知识。 本教程,您将学习如何: 添加本地视频。 添加流媒体视频。 启用播放控件。 实现循环。 实现画中画。...这就是应用程序如何用数据填充现有列表方式。 视频本身来自嵌入应用程序包 JSON 文件。 如果您好奇,您可以查看 Video.swift 以了解它们是如何获取。...2) 在这里,您获取 url 并创建一个 AVPlayer 对象。 AVPlayer 是 iOS 上播放视频核心。 播放器对象可以启动和停止您视频,更改其播放速率,甚至可以调高和调低音量。...2) 您使用初始值设定项创建 LoopingPlayerUIView 实例并返回实例。 3) SwiftUI 需要更新底层 UIView 时会调用此方法。 现在,将其留空。...您会在左上角看到画中画按钮……否则不会! 缺点是,撰写本文,iOS 14.5是可用最新版本,VideoPlayer SwiftUI 视图未显示画中画按钮

6.9K10

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

使用 environmentObject 情况下,如何避免创建实例视图被重新计算Q:如何在避免重新计算顶层视图 body 情况下,不同子树两个子视图之间共享状态( 例如 ObservableObject...A:EnvironmentObject 是一个很好工具。如果你不想让父视图也被更新,可以创建对象不使用 @StateObject 或 @ObservedObject 。...对于苹果工程师给予建议有一点请注意,那就是如果有父视图中修改该环境对象实例需求,须确保父视图不会被反复重构( SwiftUI 重新创建视图类型实例 )。...WindowGroup 和 OpenWindowActionQ: macOS 上是否可以创建新窗口附加参数?我同一个子上下文中创建一个托管对象,并希望将这个对象发送到一个窗口。...它也可以 iPadOS 上工作,将创建一个场景,即 2/3 或 1/3 分割。

12.2K20

架构之路 (五) —— VIPER架构模式(一)

开始 首先看下主要内容: 本教程,您将了解如何SwiftUI和Combine中使用VIPER体系结构模式,同时构建一个允许用户创建公路旅行iOS应用程序,来自翻译。...Data Sources组,有用于保存或加载数据辅助函数。 如果您喜欢WaypointModule组查看前面的内容。它有一个Waypoint编辑屏幕VIPER实现。...路由器Router处理屏幕之间导航。这与SwiftUI不同,SwiftUI,视图显示任何视图。...当将用户操作发送回数据模型,VIPER模式甚至更有用。 为此,您将添加一个按钮创建一个旅程。...当您将其放置NavigationView,该链接将成为一个按钮,将destination推送到导航堆栈上。 content块可以是任何一个SwiftUI视图。

17.4K10

优化 SwiftUI List 显示大数据集响应效率

也就是当显示主界面菜单,列表视图已经完成了实例创建(可以通过 ListEachRowHasID 构造函数添加打印命令得以证明),因此也不应是实例化列表视图导致延迟。... SwiftUI 视图生命周期研究[3] 一文,我对 List 如何对子视图显示进行优化做了一定介绍。...另外如果 id 标识值发生变化,SwiftUI 将丢弃原视图(生命周期终止及重置状态)并重新创建视图。...问题 细心朋友应该可以注意到,运行解决方案一代码后,第一次点击 bottom 按钮,大概率会出现延迟情况(并不会立即开始滚动)。...生产中处理方式 本文为了演示 id 修饰符 ForEach 异常状况以及问题排查思路,创建了一个在生产环境几乎不可能使用范例。

9.1K20

SwiftUI 与 Core Data —— 数据获取

尽管在实践,如果能在确保不访问托管对象非线程安全属性前提下,创建托管对象线程持有托管对象并不会出现崩溃情况,但出于谨慎考虑,我最终还是放弃了这种方式。...这将有两个作用:数据变化后将引发与其绑定视图进行更新由于底层数据并不保存在视图中,因此视图存续期中 SwiftUI 可以随时创建视图描述实例而无需担心数据丢失虽然苹果没有公开 _makeProperty...创建自定义 DynamicProperty 类型,需要注意以下几点:可以自定义类型中使用环境值或环境对象视图被加载后,视图中所有符合 DynamicProperty 协议类型也将一并具备访问环境数据能力...当 SwiftUI 视图存续期中重新创建视图描述实例,自定义类型也将一并重新创建在视图存续期中,如果 SwiftUI 创新创建了视图描述实例,那么无论视图描述( 符合 View 协议 Struct...image-20221203185621897允许构造方法不提供 NSFetchRequest当在视图中使用 @FetchRequest ,我们必须在声明 FetchRequest 变量设置 NSFetchRequest

4.6K30

SwiftUI 状态管理系统指南

——比如我们 "Done "按钮动作处理程序把isEditingViewShown设置为false。...因此,虽然下面的内容在技术上可能会被编译,但最终会导致运行时问题——因为当我们视图更新重新创建,UserModelController实例可能会被删除(因为我们视图现在是它主要所有者):...标记为StateObject属性与ObservedObject行为完全相同——此外,SwiftUI将确保存储在此类属性任何对象不会因为框架在重新渲染视图重新创建实例而被意外释放: struct...尽管一个父视图和它一个子视图之间创建绑定通常很容易,但在整个视图层次结构传递某个对象或值可能相当麻烦——而这正是环境变量旨在解决问题类型。 有两种主要方法来使用SwiftUI环境。...小结 SwiftUI管理状态方式绝对是该框架最有趣方面之一,它可能需要我们稍微重新思考数据应用传递方式——至少涉及到将被我们UI直接消费和修改数据是这样。

5K20

StateObject 与 ObservedObject

SwiftUI 也会在视图存续期内因多种原因,不断地依据描述该区域声明创建实例,从而保证始终能够获得准确计算值。...当将视图加载到视图树SwiftUI 会根据当时采用实例将需要绑定状态( @State、@StateObject、onReceive 等 )托管到 SwiftUI 托管数据池中,之后无论实例再被创建多少次... @StateObject 研究[4] 一文,展示了因错误使用 ObservedObject 而引发灵异现象代码片段出现这种情况是因为一旦,视图存续期中,SwiftUI 创建实例并使用了该实例...( 有些情况下,创建实例并不一定会使用 ),那么,最初创建 TestObject 类实例将被释放( 因为没有强引用 ),ObservedObject 持有的订阅关系也将无效。...不在构造方法引入无关操作可以极大地减轻系统负担。对于数据准备工作,可以使用 onAppear 或 task ,视图加载进行。

2.4K20

SwiftUI 与 Core Data —— 数据定义

今后文章我们将尝试用思路来创建一个 SwiftUI + Core Data app,看看能否避免并改善之前一些问题。本文将首先探讨如何定义数据。...遗憾是,托管对象对于以值类型为主 SwiftUI 来说并不算友好,因此,不少开发者都会在视图中将托管对象实例转换成一个结构体实例以方便接下来操作( 如何在 Xcode 下预览含有 Core Data...对于 SwiftUI 来说,托管对象具备两个非常显著特点:懒加载托管对象所谓托管是指:该对象被托管上下文所创建并持有。仅在需要时候,才从数据库( 或行缓存 )中加载所需数据。...配合 SwiftUI 加载容器( List、LazyStack、LazyGrid ),可以完美地性能与资源占用间取得平衡实时响应变化托管对象( NSManagedObject )符合 ObservableObject...为了保留 Core Data 优势,我们不得不在视图中引入托管对象,引入了托管对象就不得不先建模,再转换。是否可以创建一种既可保留托管对象优势同时又不用在代码显式引入特定托管对象方式呢?

2.4K40

SwiftUI 布局工作原理

在此过程,您还将学习如何创建更高级布局对齐,使用GeometryReader构建特殊效果,以及更多——我知道您会热衷于自己应用程序中部署一些真正强大功能。...继续使用单视图应用程序模板创建一个 iOS 项目,并将其命名为 layoutDageMetricy。...这三条规则看起来很简单,但它们允许我们创建非常复杂布局,每个视图都可以决定如何以及何时调整大小,而无需父级参与。...,我向您解释过,当您对视图应用修饰符,我们实际上会得到一个名为ModifiedContent视图类型,它存储了原始视图及其修饰符。...这意味着当我们应用修饰符,进入层次结构实际视图是修改后视图,而不是原始视图。 我们简单background()示例,这意味着ContentView顶层视图是背景,而内部是文本。

3.7K20

Ask Apple 2022 与 Core Data 有关问答 (下)

应用程序中一次性加载 CoreData 数据并将其保存在局部变量中使用多个 FetchRequests我目前 SwiftUI 中使用 UICalendarView 并从 CoreData 获取数据...例如,当你创建一个带有字符串属性对象,初始值( 没有默认值情况下 )是 nil,这在对象被验证之前( 通常在 save )是没有问题。...我数据模型中有一个 Int16 类型 userOrder 属性,表视图行被重新排序后,有什么好方法来保存数据顺序?...为了管理有序关系,Core Data UInt16 空间中计算一个对象索引,正好在前一个和后一个对象中间。当整数空间用完,将在任何一个方向上跨出一个对象,并均匀地重新分配这些对象。...持久化历史如何体现有序对象变化状态Q:持久化历史如何体现 “有序” 关系对象顺序发生了改变?NSPersistentHistoryChange 是否包含父实体或子实体?

3.2K20

我庆幸果断放弃了SwiftUI:它还不够成熟

考虑到配套创作工具 CiderKit 发展成熟过程也变得愈发复杂,再加上创建各种窗口和 UI 元素实际需求,我决定尝试用用 SwiftUI。...但每当 SwiftUI 更新检查器视图(这种更新可能出现在移动过程,甚至是输入文本字段时候),渲染速率都会下降到每秒 10 到 15 帧,而且相当不稳定。这显然让人无法容忍。...首先,由可选对象提供视图每次重绘都是完全重新创建。我虽然通过缓存稍稍提升了性能表现,但实际体验仍然非常糟糕。事实证明,SwiftUI 检查器视图就是没法提供合理重绘速度。...但这会导致检查器值出现延迟,因此地图编辑器交互过程(比如使用移动工具)结果不准确,所以效果还是称不上完美。 但我觉得这可能只是个独立问题,并不能因此把 SwiftUI 一棒子打死。...但上图展示效果其实是 AppKit 完成,因为我 SwiftUI 一直实现不了预期功能。大家应该注意到了,中间 SpriteKit 视图上有三个按钮(分别是 +、200% 和 -)。

4.9K20

深度解读 Observation —— SwiftUI 性能提升新途径

WWDC 2023 ,苹果介绍了 Swift 标准库成员:Observation 框架。它出现有望缓解开发者长期面临 SwiftUI 视图无效更新问题。...宏(Macro)是 Swift 5.9 中新增一项功能。它允许开发者在编译操纵和处理 Swift 代码。...SwiftUI 视图如何观察属性变化 根据 Observation 框架工作原理,我们可以推测 SwiftUI 大概会采用下面的方法可观察属性与视图更新之间创建联系: struct A:View...然而,由于 Observation 框架暂不支持创建可持续性观察行为,每次评估后视图都需要重新创建观察操作( 用时极少 )。我们需要更多时间来评估这是否会导致性能问题。...改用 Observation 框架后,上述优化策略将不再是最优解。相反,以前不推荐方式更加适合可观察对象

49620

使用 SwiftUI 创建一个灵活选择器

使用 UIKit ,我总是将这种类型视图实现为具有特定 UICollectionViewFlowLayout UICollectionView。但在 SwiftUI 如何实现呢?...所有符合该协议对象必须实现两个属性:displayedName(选择器显示名称)和 isSelected(一个布尔值,指示特定选项是否已选择)。...接下来,创建了用于计算特定字符串值宽度和高度字符串扩展。由于我实现允许更改字体大小和权重,因此先前提到两个扩展都以由灵活选择器使用 UIFont 作为参数。...singleLineResult 可能不会为空,也不会附加到 allLinesResult ——因为我们只减去项目宽度结果小于 0 附加 singleLineResult。...然后,详细介绍了实现该选择器逻辑,包括如何处理选项布局、宽度和高度,以及如何处理用户与按钮交互。 最后,提供了一个简单视图实现,可以 SwiftUI 中使用该选择器。

24520
领券