在尝试使用 Timer.scheduledTimer 的 SwiftUI 代码中获取未解析的标识符“self”

2023-11-30

在 SwiftUI 中,我注意到使用一个计时器:

尝试 1 - 这不起作用,因为获取“使用未解析的标识符‘自我’”

var timer2: Timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) {
    self.angle = self.angle + .degrees(1)
}

尝试 2 - 有效,但必须输入“_ = self.timer”才能稍后启动

var timer: Timer {
    Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) {_ in
        self.angle = self.angle + .degrees(1)
    }
}
// then after need to use " .onAppear(perform: {_ = self.timer}) "

有没有办法让我的 Try1 工作?那是我可以在 SwiftUI 文件中预先创建计时器的位置吗?或者实际上 SwiftUI 中通常会在哪里启动和停止计时器?即生命周期方法在哪里

整个文件:

import SwiftUI

struct ContentView : View {

    @State var angle: Angle = .degrees(55)

//    var timer2: Timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) {
//        self.angle = self.angle + .degrees(1)
//    }

    var timer: Timer {
        Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) {_ in
            self.angle = self.angle + .degrees(1)
        }
    }

    private func buttonAction() {
        print("test")
        self.angle = self.angle + .degrees(5)
    }

    var body: some View {
        VStack{
            Text("Start")
            ZStack {
                Circle()
                    .fill(Color.blue)
                    .frame(
                        width: .init(integerLiteral: 100),
                        height: .init(integerLiteral: 100)
                    )
                Rectangle()
                    .fill(Color.green)
                    .frame(width: 20, height: 100)
                    // .rotationEffect(Angle(degrees: 25.0))
                    .rotationEffect(self.angle)
            }
            Button(action: self.buttonAction) {
                Text("CLICK HERE")
            }
            Text("End")
        }
         .onAppear(perform: {_ = self.timer})

    }
}

我不清楚您的示例是否需要一个计时器,但由于存在大量关于如何在 SwiftUI 应用程序中包含计时器的错误信息,我将进行演示。

关键是将计时器放在其他地方并在每次触发时发布。我们可以通过添加一个类来轻松地做到这一点,该类将计时器作为可绑定对象添加到我们的环境中(请注意,您将需要导入合并):

class TimerHolder : BindableObject {
    var timer : Timer!
    let didChange = PassthroughSubject<TimerHolder,Never>()
    var count = 0 {
        didSet {
            self.didChange.send(self)
        }
    }
    func start() {
        self.timer?.invalidate()
        self.count = 0
        self.timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { 
            [weak self] _ in
            guard let self = self else { return }
            self.count += 1
        }
    }
}

我们需要通过环境向下传递此类的实例,因此我们修改场景委托:

window.rootViewController = 
    UIHostingController(rootView: ContentView())

becomes

window.rootViewController = 
    UIHostingController(rootView: ContentView()
        .environmentObject(TimerHolder()))

最后,让我们建立一些启动计时器并显示计数的 UI,以证明它正在工作:

struct ContentView : View {
    @EnvironmentObject var timerHolder : TimerHolder
    var body: some View {
        VStack {
            Button("Start Timer") { self.timerHolder.start() }
            Text(String(self.timerHolder.count))
        }
    }
}

EDIT对于那些没有关注情节的人来说,更新:BindableObject 已迁移到 ObservableObject,并且不再需要手动发送信号。所以:

class TimerHolder : ObservableObject {
    var timer : Timer!
    @Published var count = 0
    // ... and the rest is as before ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在尝试使用 Timer.scheduledTimer 的 SwiftUI 代码中获取未解析的标识符“self” 的相关文章

  • 如何在 SwiftUI 中延迟动画?

    我想为两个文本字段设置动画 第二个字段有延迟 但它不起作用 没有延迟 它们同时从位置 100 动画到 0 这是代码 State private var offset CGFloat 100 State private var offset2
  • 从 URL 解析 JSON 最终出现错误 - Swift 5

    我正在尝试用 swift 编写一个函数 从 URL JSON 获取数据 并将其分配给 swift 中的变量 这是函数 func getBikeData guard let url URL string https api citybik e
  • 如何在 iOS swift 中集成 Google Pay?

    嗨 朋友们 我搜索过有关 iOS swift 中谷歌支付集成的信息 我没有找到任何相关的解决方案 请帮助我如何解决这个问题 如果有任何链接或示例 请提供链接并指导我 谢谢 这是关于在印度发起 Google Pay 操作的问题吗 例如 使用
  • SwiftUI 导航:如何将详细信息视图切换到不同的项目?

    我正在努力实现以下导航行为 用户可以从列表中选择一个项目 该项目会触发该项目的详细信息视图 在此详细视图上 导航栏中有一个 添加 按钮 可打开用于添加其他项目的模式表 到目前为止 一切都按预期进行 但添加项目后 我希望详细视图显示新项目 我
  • 尝试使用 Xcode 的新 UI 测试运行多个测试失败

    当我尝试在新的 Xcode beta 中同时运行多个 UI 测试时 它在第一次测试后失败 并在第一次测试后的每个测试中出现错误 UI 测试失败 应用程序状态仍未终止 有人解决这个问题了吗 我也遇到过同样的问题 看来 至少就我而言 应用程序从
  • Alamofire 仅在 GET 请求上出现请求错误

    我正在努力将我的项目从 AFNetworking 转移到 Alamofire 真的很喜欢这个项目 POST 请求工作得很好 但是 我在尝试发出 GET 请求时收到此错误 这是一些示例代码 class func listCloudCrednt
  • 排除 Realm 模型类

    我的应用程序中配置了两个领域文件 我想存储我的Log将模型与其他模型分开保存为单独的文件 我的问题是我也看到了我的Log我不想要的默认 Realm 文件中的模型类 如何从给定的 Realm 文件中排除特定的模型类 我使用主 Realm 文件
  • 如何使用 SwiftUI 拖动工作滑块

    我想拖动一个滑块 当然也让它滑动 我可以做其中之一 但我不能两者都做 如何拖动并拥有可用的滑块 我也尝试找到一种方法来删除手势 但我找不到方法来做到这一点 还尝试了 Apple Composition SwiftUI Gestures 文档
  • 如何更改某些功能以兼容 iOS 10 或更低版本的 Snapchat 中的某些功能,例如相机视图控制器

    我正在制作一个视图控制器来制作像 snapchat 相机一样的相机视图控制器 我下面的代码在 iOS 11 或更高版本上完美运行 老实说 我并没有真正掌握我的代码 因为我只是按照这个像相机视图控制器这样的 snapchat 的教程进行操作
  • 从钥匙串保存和加载 |斯威夫特[重复]

    这个问题在这里已经有答案了 如何简单地将字符串存储在钥匙串中并在需要时加载 有几种SO解决方案 主要参考Git repo 但我需要最新 Swift 上最小和最简单的解决方案 当然 我不想添加 git 框架来简单地在我的项目中存储密码 有类似
  • 运行时警告 CLSUserDefaults 实施了两次

    在 cocoapod 源中使用 import 语法时 我在 pod 定义的类中看到了与下面类似的警告 但这是一个内部苹果类定义 CLSUserDefaults 我无法控制它 也不会进行子类化 我不知道这是否真的造成了问题 但它不应该发生 o
  • 根据图像制作具有 UIImageView 高度的 UICollectionViewCells

    我想做一个UICollectionView单元格的宽度是屏幕的宽度 但高度取决于单元格的宽高比UIImageView inside 在我目前的实施中 所有UICollectionViewCell实例是正方形 这不是我想要的 我想以某种方式使
  • SwiftUI - 取决于多个条件

    SwiftUI 中是否可以依赖多个条件 例如显示一个工作表 sheet isPresented stateA stateB content this is not working 或者已知有不同的方法 我只能带你去看门 c 墨菲斯 今天是运
  • macOS 应用程序中还需要 Swift 的嵌入式 dylib吗?

    Swift 5 发行说明说 对于运行 iOS 12 2 watchOS 5 2 和 tvOS 12 2 的设备 Swift 应用程序不再在构建变体中包含 Swift 标准库和 Swift SDK 覆盖的动态链接库 但在同一上下文中没有提及
  • 如何在 Swift 中使用 CGFloat?

    var posinonY Float Float y Float pipeDown size height Float verticalPipeGap pipeDown position CGPointMake 0 0 Float posi
  • 新的 FUITableViewDataSource - 如何使用?雨燕3

    刚刚更新到较新的 FirebaseUI Pod 有些事情发生了变化 但其中最大的变化之一是 FUI 表视图的工作方式 我让它在旧版本上运行良好 但在下面遇到了困难 并且缺乏文档 示例 self dataSource FUITableView
  • Swift -boundingBox 导致 EXC_BAD_ACCESS (代码 = 1)

    我正在使用 SceneKit 来显示文本节点 这是我的代码 foo swift extension SCNNode func getNodeSize gt width Float height Float let min max bound
  • 如何在 EKRecurrenceRule 中设置一周中某一天的数组?

    我想在用户选择的特定日期每周添加事件 可以是一个或多个 也可以是一整天 我将用户选择的日期值存储在模型类变量中 但是 当我添加事件并选择日期时 假设今天是星期一 我选择星期二和星期三并保存 然后我查看周一和周三添加的 iPhone 日历 我
  • Swift 中 UIImages 的淡入淡出动画

    我有一组图像 我希望它们在登录屏幕的背景中淡出 我无法在 swift 中找到任何可以做到这一点的东西 有什么办法我可以做到吗 这是我当前的代码 override func viewDidLoad super viewDidLoad star
  • 播放(非库)Apple Music 内容 - 请求失败

    我正在尝试使用以下代码播放专辑 let predicate MPMediaPropertyPredicate value 1459938538 forProperty MPMediaItemPropertyAlbumPersistentID

随机推荐

  • 添加、减去 datetime.time 列 pandas

    我有以下数据框 flight departure arrival at desination boarding total flight time total flight time 2 time to collect bags 0 00
  • C# 是具有泛型类型约束的泛型类型

    我们假设一个接口 interface IOwnedBy
  • 罕见的 IE10 bug:背景位置的 CSS 动画在多个背景和百分比下失败

    这是一个非常具体的错误 但是 我希望有人能向我展示解决方法 该错误主要在于 IE10 无法执行 CSS 动画background position当这两个条件满足时同时 拥有多重背景 Setting background position以
  • 按列提取 PDF 文本

    我的问题是 如何从按列划分的 PDF 文件中提取文本 并获得按该列分隔的结果 背景 我从事一个关于文本分析 尤其是科学文本 的项目 这些文本有时以多栏布局发布 每栏都有一个单独的页码 要按布局页码对提取的文本进行排序 按列提取文本会很有用
  • Redis 中的范围查询 - Spring Data Redis

    有没有一种方法可以使用 Spring Data Redis 在 Redis 中实现范围查询 Eg 如果我的 Pojo 类有 Date 不是主键 并且我需要属于所需日期期间的数据 是否可以使用 Spring Data Redis 构建相同的查
  • iframe 内的页面看不到自己的 cookie

    我们有 2 个位于不同域的网站 为了简单起见 我们假设它们是 App 运行在上面的 SPA 应用程序main app com app Host 运行一个简单的index html页面random site com index html in
  • awk 搜索一个文件中的列,如果匹配则打印两个文件中的列

    我正在尝试比较 file1 中的第 1 列和文件 2 中的第 3 列 如果它们匹配 则打印 file1 中的第一列和 file2 中的前两列 这是每个文件的示例 file1 Cre01 g000100 Cre01 g000500 Cre01
  • 放置现有的sqlite数据库并读取

    在 android 文件夹结构中将现有的 sqlite 数据库放置在哪里 是drawable文件夹还是layout文件夹 我没有找到任何解决方案 任何帮助将不胜感激 你应该把它放在assets文件夹 这样你就可以确保它会附加到你的 apk
  • Vuejs图片src动态加载不起作用

    我刚刚开始使用 Vue js 和 Vue CLI 我遇到了一个问题 我不明白为什么我不能从范围内动态设置图像 但我可以直接在 HTML 中编写它 obj img是一个字符串 assets logo png也很有价值 我伪造 ajax 调用超
  • 如何生成 firebase 注册令牌

    我正在尝试使用新方法生成 firebase 注册令牌 但无法生成以下代码 MyFirebaseInstanceIdService java public class MyFirebaseInstanceIdService extends F
  • UIView 边界和框架的属性观察者的反应不同

    当我正在探索观察的选项时UIView s bounds or frame改变 提到here and here 我遇到了一个非常奇怪的差异 didSet and willSet将根据您放置的位置不同地触发UIView在视图层次结构中 如果我使
  • Gmail 不会在电子邮件中呈现 html

    我将用一个非常基本的示例再尝试一次 当我使用 PHP 向电子邮件客户端发送电子邮件时 除了 gmail 之外 没有任何问题 当我在 gmail 中查看电子邮件时 我看到的只是邮件的代码 Gmail 不显示 HTML 它只是显示代码 这是我的
  • 如何在 Accord.net 中保存“学习状态”?

    我是机器学习和 Accord net 的初学者 我了解了如何训练它然后使用它 但在企业环境中 在服务器上运行它 我如何坚持 Accord net 的学习成果 我是否需要保存所有训练数据并在每次重新启动应用程序时重新训练 通过添加在代码中导入
  • Linux crontab 每月第 n 个星期六

    除周六外 我喜欢在所有工作日恢复跑步 我的 crontab 条目 30 16 1 2 3 4 5 backup sh 这个条目工作正常 另外 我喜欢在第一 第三个星期六恢复 如果一个月内有第五个星期六可用 则应运行备份 crontab 的条
  • 从 Scanner 获取输入时 Maven 挂起

    我正在设计一个程序 该程序必须使用 mvn test 命令运行并从命令行获取用户输入 当我使用 mvn test 运行程序时 一切正常 直到Scanner next 执行后 CLI 挂起 我必须关闭该程序 my test method pu
  • PHP if not equal(!=) and or (||) 问题。为什么这不起作用?

    我知道这是简单的 PHP 逻辑 但它就是行不通 str dan if str joe str danielle str heather str laurie str dan echo a href Get to know get the a
  • YouTube 数据 API v3 调用返回的最大结果是多少

    Context 我正在提供一些有关使用 YouTube Data API V3 进行 HTTP GET 的咨询 为了开发一个基于 Windows 的应用程序来从 Youtube 获取结果列表 例如特定类别或特定标签 我们愿意使用任何编程语言
  • 使用 Zend/PHP 删除 YouTube 视频

    我正在使用 Zend 和 PHP 从我的主页上传和删除视频 上传部分工作正常 但下载部分比较复杂 videoEntryToDelete yt gt getVideoEntry videoId yt gt delete videoEntryT
  • 如何将 HTML 小部件与外部 CSS 隔离

    我使用 AngularJS 开发了一个即时消息组件 可以向任何网页添加即时消息功能 该组件相当复杂 其样式表长达约 800 行 当该组件部署到第三方网站时 我遇到了问题 有时 主机网站的 CSS 会影响聊天小部件的样式 当组件被添加到新的
  • 在尝试使用 Timer.scheduledTimer 的 SwiftUI 代码中获取未解析的标识符“self”

    在 SwiftUI 中 我注意到使用一个计时器 尝试 1 这不起作用 因为获取 使用未解析的标识符 自我 var timer2 Timer Timer scheduledTimer withTimeInterval 1 repeats tr