2016-01-28 1 views
0

В моем приложении у меня есть mainViewController с некоторым контентом на нем. В некоторых случаях я загружаю контроллер просмотра наложения из раскадровки. Контроллер просмотра наложения меньше экрана и отображается поверх основного монитора. Я инициализировать его следующим образом:Короткое отставание при настройке текста меток с помощью раскадровки

class MyOverlayViewController { 
    @IBOutlet var textLabel: UILabel! 
    @IBOutlet var countLabel: UILabel! 

    static let storyboard = UIStoryboard(name: "...", bundle: nil) 

    // Return a new view controller 
    class func newViewControllerWithData(data: AnyObject) -> UIViewController { 
     let vc = storyboard.instantiateViewControllerWithIdentifier("MyOverlayViewController") as! MyOverlayViewController 

     Timing.performAfterDelay(0) { 
      vc.titleLabel.text = data[...] // Load title label text 
      vc.countLabel.text = data[...] // Load count label text 
     } 

     return vc 
    } 
} 

Я не могу установить текст этикетки непосредственно в методе newViewControllerWithData, потому что производит следующее сообщение об ошибке: fatal error: unexpectedly found nil while unwrapping an Optional value. Так этикетки nil при доступе к ним сразу же в этом методе.

Кажется, что две выходы с меткой не загружены сразу, когда контроллер представления создается из раскадровки, потому что для этого требуется (очень) короткое время.

Поэтому я использую свой метод Timing.performAfterDelay(0), который выполняет код после следующего цикла цикла цикла (он запускает таймер с длительностью 0 и выполняет код как обратный вызов). Код (я проверил это), выполненный в основном потоке.

Проблема заключается в следующем:
Иногда (не всегда, и не воспроизводимый!), При загрузке контроллера вида наложения, на долю секунды метка является пустого (как я определил их в раскадровке), прежде чем они покажут текст. Таким образом, пользователь видит пустые метки в течение короткого момента, прежде чем фактические данные будут загружены в метки.

Как я могу исправить это поведение?
Возможно ли каким-либо образом получить доступ к розеткам сразу после создания экземпляра контроллера вида из раскадровки, не используя Timing.performAfterDelay(0)?

Справка будет принята с благодарностью.

ответ

3

Розетки установлены после вид загружается, то есть когда viewDidLoad вызывается на контроллер вида. Тем не менее, вызов его прямо как vc.viewDidLoad() не будет работать, вам нужно получить доступ к представлению контроллера вида, например, let dummyVariable = vc.view. Вот код, который принудительно загружает представление, а затем устанавливает значения метки.

class func newViewControllerWithData(data: AnyObject) -> UIViewController { 
    let vc = storyboard.instantiateViewControllerWithIdentifier("MyOverlayViewController") as! MyOverlayViewController 
    let _ = vc.view // force load the view 
    // now set your outlets as you please 
    vc.titleLabel.text = data[...] // Load title label text 
    vc.countLabel.text = data[...] // Load count label text 
    return vc 
} 

Примечание: Это не очень хорошая практика, хотя. MyOverlayViewController должен нести ответственность за установку своих значений меток вместо того, чтобы они были установлены снаружи. Вы можете передать ему необходимые данные через свойство или аргумент методу и т. Д.

+0

Хорошо, спасибо, это решает проблему! –

+0

, пожалуйста, отметьте ответ, принятый :) – ishaq

+0

Через 15 минут. –