iOS 9 Today Widget не вызывает viewDidLoad

Виджет «Сегодня» отображается правильно, когда он добавляется в представление «Сегодня». Но если пользователь вернется к ней позже, функция viewDidLoad не будет вызвана и покажет устаревшие данные. Следует ли вызывать viewDidLoad каждый раз? Есть ли ошибка iOS 9 / Xcode 7 beta 6?

Изменить: добавлено, что widgetPerformUpdateWithCompletionHandler также не вызывается. У меня установлены точки останова и функции печати

func widgetPerformUpdateWithCompletionHandler(completionHandler: ((NCUpdateResult) -> Void)) {
    print("in widgetPerformUpdateWithCompletionHandler")
    fetch()

    completionHandler(NCUpdateResult.NewData)
}

person Jason Hocker    schedule 31.08.2015    source источник
comment
Я никогда не работал с виджетами, но обычно viewDidAppear вызывается каждый раз, когда отображается экран, viewDidLoad вызывается только при первоначальной загрузке представления.   -  person u.gen    schedule 31.08.2015
comment
Вы не используете widgetPerformUpdateWithCompletionHandler: см. здесь   -  person soulshined    schedule 31.08.2015
comment
У меня такая же проблема. widgetPerformUpdateWithCompletionHandler раньше вызывался каждый раз при отображении виджета. iOS9 вызывает эти методы гораздо реже. Но я не нашел никакой документации об этом изменении.   -  person just.do.it    schedule 21.09.2015


Ответы (2)


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

Однако viewWillAppear и viewDidAppear будут вызываться каждый раз при отображении вашего виджета.

person Christopher Pickslay    schedule 01.09.2015
comment
Это решило проблему и для меня - person Rand; 03.10.2015
comment
Спасибо, да, я переключился на viewDidAppear, и теперь все работает, спасибо :) - person Supertecnoboff; 27.04.2016

Отправляю свой собственный ответ, но хотел бы обсудить этот код - должен ли он быть там или как это правильно сделать? У нас был в этом методе, и убрав его виджет стал работать корректно

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator)
{

    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)

    if let safeCoordinator = coordinator as UIViewControllerTransitionCoordinator?
    {
        print("coordinator != nil")
        safeCoordinator.animateAlongsideTransition({ context in
            self.tableView.frame = CGRectMake(0, 0, size.width, size.height)
            }, completion: nil)

    }
    else
    {
        print("coordinator == nil")
    }
}
person Jason Hocker    schedule 31.08.2015
comment
Этот код выглядит так, как будто вы пытаетесь изменить размер табличного представления в ответ на то, что что-то еще изменило высоту вашего представления. Что это что-то еще? Если вы используете автоматическую компоновку, размер таблицы должен измениться в соответствии с количеством отображаемых ячеек. В противном случае вы можете установить preferredContentSize, чтобы точно указать нужную высоту. - person Christopher Pickslay; 01.09.2015
comment
@ChristopherPickslay Разве Apple не отговаривает от использования selectedContentSize ? - person Supertecnoboff; 27.04.2016
comment
@Supertecnoboff не то чтобы я в курсе: If you don’t use Auto Layout, you can use the UIViewController property preferredContentSize to request a height for the widget. developer.apple.com/library/ios/documentation/General/ - person Christopher Pickslay; 28.04.2016