gpt4 book ai didi

ios - 无法更新 UILabel!在具有字符串值的 ViewController 中

转载 作者:行者123 更新时间:2023-11-28 21:21:47 24 4
gpt4 key购买 nike

好的,所以这个应用程序应该做的就是在屏幕上显示一个时钟,该时钟每秒通过计时器更新一次。我正在使用 Xcode 8/Swift 3。

下面是来自 View Controller 的代码:

import UIKit

class ViewController: UIViewController {

override func viewDidLoad() {

let clock = clockClass()
clock.startTimer()
//currentTime.text = "It Works Here!"
}

func updateClockView(updatedTime : String) {

print("new time is: \(updatedTime)")
//currentTime.text = updatedTime
}

/*

ACTIONS AND LABELS BELOW HERE PLEASE

*/

@IBOutlet weak var currentTime: UILabel!

}

如果我重新安排代码以便所有代码都在 viewcontroller 文件中,那么它可以完美运行。为了保持类似 MVC 的外观,我将计时器代码移到了另一个类,然后将更新后的时间传回给 viewcontroller。

下面是另一个类 clockClass 的代码。

import Foundation

class clockClass{

let view = ViewController()

public func startTimer(){
var timer = Timer()
timer = Timer.scheduledTimer(timeInterval: 1,
target:self,
selector: #selector(clockClass.updateClock),
userInfo: nil,
repeats: true)

timer.fire()

}

/*
updateClock CONSTRUCTS THE CURRENT TIME BY EXTRACTING THE HOURS, MINUTES AND SECONDS COMPONENTS FROM THE CALENDAR OBJECT AND THEN FORMATTING THAT DATE INTO STRING FORMAT. THE CLOCK ON THE SCREEN IS THEN UPDATED IN REAL TIME.

*/
@objc func updateClock(){
let dateObject = NSDate()
let calendar = NSCalendar.current
let components = calendar.dateComponents([.hour, .minute,.second], from: dateObject as Date )

let formatter = DateFormatter()
formatter.timeStyle = .medium

let theDateIWant = calendar.date(from: components)!
let timeString = formatter.string(from: theDateIWant)



view.updateClockView(updatedTime: timeString)
}
}

我可以通过调试器看到一切正常,直到将“updatedTime”分配给 UILabel!在 View Controller 的 updateClockView() 中。它在赋值点崩溃,出现“ fatal error :在展开可选值时意外发现 nil”。检查后,变量“updatedTime”作为普通字符串返回,而不是可选字符串。奇怪的是,我可以更新 UILabel!通过“currentTime.text = stringVariable/textString”,如果我从 viewDidLoad() 中这样做的话。然而,这并不是每秒更新一次。

如果在正常运行程序时,我打印到控制台而不是更新 UILabel!,那么新时间每秒都会打印出来。

我尝试过以各种方式重新排列代码以及使用 dispatchQueue.main.async() 更新主线程(我假设我做的是正确的,因为程序运行时没有编译或运行时错误,但时钟确实不显示,没关系更新自己)。

其他谷歌搜索仅导致对旧版本的 swift 的引用,其中包含已弃用的功能或帖子/文章,这似乎超出了我的理解范围。

谁能发现我遗漏的阻止该程序正常运行的错误?我已经在这里工作了 10 多个小时,没有多少头发可以留着....

非常感谢!

编辑:请在此处查看屏幕截图:[1]:http://i.stack.imgur.com/rgQgd.png

最佳答案

查看您的代码,您似乎缺少委托(delegate)的基本概念。

这整个事情可以通过 delegation 模式来完成,或者这可以通过添加两行代码来完成。只需在 clockClass 类中创建 ViewController 的属性

您需要在 clockClass 中进行更改

let view = ViewController()var view: ViewController

替换 ViewController 中的这些行

let clock = clockClass()
clock.startTimer()

用这些线

let clock = clockClass()
clock.view = self
clock.startTimer()

关于ios - 无法更新 UILabel!在具有字符串值的 ViewController 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39582302/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com