我有一个UIViewController
并且正在重构它,我遇到了需要从另一个类更新它的情况。我知道我需要使用delegate pattern,但是我很难找到一个适合我的情况的例子(我认为这非常简单)。ItemViewController
有一个实例化的类。我正在尝试从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
}
在
Timer
上,我声明了以下属性:@IBOutlet weak var timeValueLabel: UILabel?
我将其设置为
ItemViewController
中的Timer
代表,如下所示:timer.delegate = self
我要做的是当
viewDidLoad
被调用时,我想在updateLabel
上更新Timer
。这就是我被困的地方…接下来呢? 最佳答案
如果您的Timer
类从任何位置分配,并且您需要更改标签的文本,那么您可以使用singleton对象来完成此操作,使用您的Timer
类创建一个singleton对象,然后使用该对象以这种方式设置委托。
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
。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.
}
}