问题标签 [property-wrapper]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
initialization - SwiftUI 视图(显然)在 init 运行之前布局
TL;博士
以下似乎ContentView
评估了之前运行的主体if
声明。init
是否存在竞争条件,或者我的心理模型是否有问题?
荣誉
向 Asperi 致敬,他提供了解决当今问题的等效状态初始化器。
代码
为什么ContentView
显示“dummy is nil”?似乎有些东西在初始化设置之前dummy
就被关闭了。解决问题的第二个任务是什么?
swift - SwiftUI:ObservableObject 在重绘时不会保持其状态
问题
为了实现应用程序代码的简洁外观,我为每个包含逻辑的视图创建了 ViewModel。
一个普通的 ViewModel 看起来有点像这样:
并像这样使用:
当 Views Parent 没有被更新时,这可以正常工作。如果父级的状态发生变化,这个视图会被重绘(在声明性框架中很正常)。但是ViewModel 也会被重新创建并且之后不会保持状态。与其他框架(例如:Flutter)相比,这是不寻常的。
在我看来,ViewModel 应该保留,或者 State 应该保留。
如果我将 ViewModel 替换为@State
Property 并int
直接使用(在此示例中),它将保持持久化并且不会重新创建:
这显然不适用于更复杂的国家。如果我为@State
(如 ViewModel)设置一个类,越来越多的事情不会按预期工作。
问题
- 有没有办法不每次都重新创建 ViewModel?
- 有没有办法复制
@State
Propertywrapper@ObservedObject
? - 为什么@State 将状态保留在重绘上?
我知道通常在内部视图中创建 ViewModel 是不好的做法,但是可以通过使用 NavigationLink 或 Sheet 来复制这种行为。
有时,当您想到一个非常复杂的 TableView 时,将 State 保留在 ParentsViewModel 中并使用绑定是没有用的,其中 Cell 本身包含很多逻辑。
对于个别情况,总有一种解决方法,但我认为如果不重新创建 ViewModel 会更容易。
重复的问题
我知道有很多关于这个问题的问题,都在谈论非常具体的用例。在这里我想谈谈一般问题,而不是太深入地讨论自定义解决方案。
编辑(添加更详细的示例)
当拥有一个改变状态的 ParentView 时,比如来自数据库、API 或缓存的列表(想想一些简单的事情)。通过 aNavigationLink
您可能会到达一个详细信息页面,您可以在其中修改数据。通过更改数据,反应式/声明式模式会告诉我们也更新 ListView,然后“重绘” NavigationLink
,然后重新创建 ViewModel。
我知道我可以将 ViewModel 存储在 ParentView / ParentView 的 ViewModel 中,但这是 IMO 的错误做法。而且由于订阅被销毁和/或重新创建 - 可能会有一些副作用。
swift - 从 JSON 解码到 PropertyWrapper
我想将 JSON 字符串解码People
为如下。age
is number( Int
) 类型,下面的代码出错:
我认为这意味着@Age
被视为Dictionary<String, Any>
.
有什么方法可以将 JSON 值解码为PropertyWrapper
属性?
ios - 在 SwiftUI 中,应用程序在滑回一半但在完成前释放时冻结而没有任何警告
以下代码重现了该错误:
从 SecondView 滑回 ContentView 但未完成手势时,应用程序冻结。删除 @Environment 或 NavigationBarItem 时将修复此错误。
对于@Environment,CoreData 需要它,但使用presentationMode 来重现错误
ios - 属性观察者和属性包装器之间的主要区别是什么?
属性观察者和属性包装器之间的主要区别是什么?它们似乎非常相似,因为它们管理属性的存储方式。我唯一能想到的是您可以重用属性包装器,因为在管理属性存储方式的代码和定义属性的代码之间存在一层分离。
属性包装器
物业观察员
上面两种情况几乎完成了相同的事情,就是将属性设置为等于或小于 12。
ios - 使用properyWrapper 实现UserDefaults 会导致奇怪的问题
我正在尝试使用@propertyWrapper
. 我想做的是为我的应用用户偏好创建一个包装类。所以我写了以下代码。
然后,我想观察 UserDefaults 值的变化。所以我实现了一个名为DefaultsObservation
.
我的 AppData 课程也在关注。
但是,当我尝试添加和监听更改layout
属性时,它无法正常工作。
当我调试它时,deinit
只要viewWillAppear
调用方法就可以工作。当我注释掉deinit
删除观察者的方法时,一切都很完美。我认为关闭deinit
会导致一些内存问题。所以我不想评论它。我错过了什么,我该如何解决?
ios - Swift 属性包装器初始化错误
我正在尝试使用 PropertWrapper 进行电子邮件验证。但是当我尝试用空字符串初始化 eamilId 变量时,我收到错误:调用中的参数标签不正确(有 'wrappedValue:',预期的 'emailId:')
这是我的视图控制器的代码
我的属性包装器的代码是
如何在使用 EmailWrapper 时在 ViewController 中使用默认值(String() )初始化emailId
binding - 将 SwiftUI 视图绑定到领域对象的意外行为
我正在为我的应用程序开发 UI,它使用 Realm 作为后端。用户在自定义 TextField 中输入文本,该 TextField 使用“浮动”标签来有效利用屏幕。标签动画(由非常简单的逻辑支持)是通过检查 Realm 对象的属性和自定义 View 之间的 Binding 状态来触发的。
当我对视图进行原型设计时,我使用了由结构支持的 @State 或 @Binding 属性,并且视图的行为完全符合预期。但是,当在我的主应用程序中使用它时,@State 或 @Binding 包装一个类(一个领域对象)并且永远不会触发转换,当然是因为视图没有注册其内部状态的更改,所以它不是重新-随着颜色和偏移的变化而渲染。
当我意识到在处理类时应该使用@ObservableObject 时,我认为我有解决方案,但这也不起作用。仔细想想,这似乎是有道理的,尽管我对各种属性包装器的工作方式有点困惑。
我非常怀疑有一个解决方法,我的第一个停靠港可能会挂接到 willChange 以修改必要的状态。但是,与此同时,有人可以解释这里发生了什么,因为我有点朦胧。如果你碰巧有一个解决方案,这可能会阻止我走上一些疯狂的切线?
自定义视图:
功能实现:
或者...
将@State/@Binding 与对象一起使用:
swift - 在 SwiftUI 中用另一个 @State 属性值初始化 @State 属性
我正在尝试根据另一个值获取进度条的进度值。这两个变量(waterQuantity 和 progress)都在属性包装器@State
这是我的代码:
如您所见,我无法使用另一个尚未初始化的变量来初始化进度。我尝试使用 init() 和 mutating func 传递值,但这些解决方案都不适合我
swift - Swift @propertyWrapper 'Self' 指的是封闭的结构/类而不是属性包装器结构
我在 Swift 中编写了一个简单的属性包装器,并尝试使用Self
和self
引用属性中的属性包装器结构/Reference<T>
类projectedValue
:
但似乎Self
不是指类型Reference<T>
。例如,如果我在结构中声明此类属性,然后使用projectedValue
:
该变量ref
是 typeTest
而不是Reference<T>
. 此代码无法编译并导致分段错误,但 Xcode 不会返回任何交互错误。为了使代码按预期工作,我必须像这样声明它:
这感觉很奇怪,是不是有意的行为?我检查了 Apple 文档,但没有记录此行为。