gpt4 book ai didi

ios - 从非 UIViewController 类在 UIViewController 上设置标签文本

转载 作者:行者123 更新时间:2023-11-28 12:40:35 25 4
gpt4 key购买 nike

我有一个 UIViewController,我正在重构它,但遇到了需要从另一个类更新它的情况。我知道我需要使用 delegate pattern ,但我很难找到适合我情况的示例(我认为这很简单)。

ItemViewController 有一个实例化的 Timer 类。我正在尝试更新 Timer 类中的 ItemViewController 标签。

Timer 上,我完成了以下操作:

weak var delegate: TimerDelegate? // weak to avoid a retain cycle

func updateLabel(timeRemaining: Int) -> String {
return formatTimeInSeconds(timeRemaining) // another method w/in Timer
}

我在 Timer 类的底部声明了 protocol

protocol TimerDelegate: class {
func updateLabel(timeString: String) -> String
}

ItemViewController 上,我声明了以下属性:

@IBOutlet weak var timeValueLabel: UILabel?

我在viewDidLoad中设置为Timer的delegate,如下:

timer.delegate = self

我想要实现的是,当 Timer 调用 updateLabel 时,我想更新 timeValueLabel.text 项目 View Controller 。这就是我被困的地方......下一步是什么?

最佳答案

如果您的 Timer 类从任何地方分配并且您需要更改标签的文本,您可以为此使用单例对象,使用您的 Timer 类创建一个单例对象然后使用该对象以这种方式设置委托(delegate)。

class Timer {
static let sharedInstance = Timer()
weak var delegate: TimerDelegate?

//Now use this delegate to call method.
func updateLabel(timeRemaining: Int) -> String {
delegate?.updateLabel(formatTimeInSeconds(timeRemaining)
return formatTimeInSeconds(timeRemaining)
}
}

现在您只需像这样在 ItemViewController 中设置此委托(delegate)。

class ItemViewController: UIViewController, TimerDelegate {

override func viewDidLoad() {
super.viewDidLoad()
Timer.sharedInstance.delegate = self
}

func updateLabel(timeString: String) -> String
self.label.text = timeString
return "" //return string that you want.
}
}

关于ios - 从非 UIViewController 类在 UIViewController 上设置标签文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39474752/

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