我有一个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.
    }
}

07-24 09:51
查看更多