.onAppear() 中的多个语句不起作用
Posted
技术标签:
【中文标题】.onAppear() 中的多个语句不起作用【英文标题】:Multiple statements in .onAppear() not working 【发布时间】:2021-01-05 01:25:40 【问题描述】:在我的代码中,我试图在 .onAppear() 修饰符中设置两个变量。代码似乎进入了一个无限循环,一遍又一遍地调用 .onAppear() 修饰符。消除这两个任务中的任何一个都有预期的结果。使用两个 .onAppear() 修饰符,每一个语句也可以按预期工作(这是我的解决方法)。
import SwiftUI
import PlaygroundSupport
struct ChartView: View
@State private var isLocked = false
@State private var isOffset = false
let timer = Timer.publish(every: 1.0, on: .main, in: .common)
.autoconnect()
var body: some View
ZStack
Text("test")
.onAppear(perform:
self.isLocked = true
//self.isOffset = true
)
.onAppear
//self.isLocked = true
self.isOffset = true
.onAppear
//self.isLocked = true
//self.isLocked = true
.onReceive(timer, perform: t in
print("Timer fired \(t) with lock \(self.isLocked)")
)
PlaygroundPage.current.setLiveView(ChartView())
在上面的代码中是三个 .onAppear() 修饰符(在我的最终代码中我只有一个),如果我在所有三个块中启用了零个或一个语句,则代码按预期执行。如果我有任何块同时启用了这两个语句,则代码将进入无限循环并且计时器永远不会触发。
在 iMac 上的 Playground 中使用 Xcode 12.3,以及针对在 iPad 上运行的 ios 应用程序。也发生在 iPad 上运行的 Playground 应用程序中。
这是一个错误,还是我做错了什么?
【问题讨论】:
【参考方案1】:我不认为这是一个明显的错误,但请记住,每次更新 @state 时,视图也可能会更新。
一种解决方法是使用 Bool.toggle(),而不是直接更新值。
这种方式只在需要时提醒我们更好或更仔细的设计。
ZStack
Text("test")
.onAppear
if !self.isLocked self.isLocked.toggle()
if !self.isOffset self.isOffset.toggle()
.onReceive(timer, perform: t in
print("Timer fired \(t) with lock \(self.isLocked)")
)
【讨论】:
以上是关于.onAppear() 中的多个语句不起作用的主要内容,如果未能解决你的问题,请参考以下文章
swift - 从 var(UITextField 输入)中删除空格不起作用