.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 输入)中删除空格不起作用

多维动态数组,为啥不起作用?

php 中的 continue 语句不起作用?

UITableViewCell 样式字幕多行不起作用

Hibernate HQL Count Distinct 不起作用?

mysql过程中的更新语句不起作用