2016-09-13 2 views
0

У меня есть UIViewController, и я рефакторинг его, и я столкнулся с ситуацией, когда мне нужно обновить его из другого класса. Я знаю, что мне нужно использовать delegate pattern, но мне сложно найти пример, который подходит для моей ситуации (что, по-моему, простое).Настройка текста надписи на UIViewController из класса, отличного от UIViewController

ItemViewController имеет класс Timer, который был создан. Я пытаюсь обновить ярлык ItemViewController от класса Timer.

На 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 TimerDelegate: class { 
    func updateLabel(timeString: String) -> String 
} 

На ItemViewController я следующее свойство заявил:

@IBOutlet weak var timeValueLabel: UILabel? 

I s и др это как делегат Timer в viewDidLoad следующим образом:

timer.delegate = self 

То, что я пытаюсь сделать случиться, когда updateLabel вызывается Timer, я хотел бы обновить timeValueLabel.text на ItemViewController. Вот где я застрял ... что дальше?

ответ

2

Если Timer класса назначить из любой точки, и вы должны изменить текст этикетки можно использовать одноплодный объект для этого, создать объект один одноплодный с Timer класса затем использовать этот объект, чтобы установить делегат таким образом.

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. 
    } 
} 
+0

Спасибо! Это привело меня к финишу :) – Adrian

+0

Приветственный помощник, счастливое кодирование :) –

0

Я думаю, что вы должны сделать:

func updateLabel(timeRemaining: Int) -> String { 
    let formattedTime = formatTimeInSeconds(timeRemaining) 
    delegate.updateLabel(formattedTime) 
    return formattedTime 
} 

И в ItemViewController вы должны объявить, что класс следует делегировать и реализовать заявленный способ. Что-то вроде:

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

}

+0

Спасибо, что посмотрели. Что входит в метод класса ItemViewController: TimerDelegate? – Adrian

+0

Это не метод, это класс, который у вас уже есть. – tonik12