Можно ли обновить таймер в виджете «Сегодня»?

Мне было интересно, можно ли обновить текстовую метку таймера в виджете «Сегодня». Я огляделся, но ничего не помогло мне.


person Nicholas    schedule 18.01.2015    source источник
comment
Я думаю, что единственный способ сделать это - передать NSTimeInterval контроллера основного представления и создать еще один таймер в виджете Today. Я придумаю способ :]   -  person Nicholas    schedule 19.01.2015


Ответы (2)


Да, ты можешь. Я только что проверил, и это работает. Вам просто нужно добавить свой таймер в основной цикл запуска NSRunLoopCommonModes:

RunLoop.main.add(yourTimerName, forMode: .commonModes)

import NotificationCenter

class TodayViewController: UIViewController, NCWidgetProviding {

    @IBOutlet weak var strTimer: UILabel!

    var timer = Timer()

    func updateInfo() {
        strTimer.text = Date().description
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateInfo), userInfo: nil, repeats: true)
        RunLoop.main.add(timer, forMode: .commonModes)
    }
    func widgetPerformUpdate(completionHandler: @escaping (NCUpdateResult) -> Void) {
        completionHandler(.newData)
    }
}
person Leo Dabus    schedule 19.01.2015
comment
спасибо за ваш ответ, я должен поместить это в свой код, так как мой таймер работает в контроллере основного представления, и я пытаюсь передать этот таймер из контроллера представления в сегодняшнее представление, используя NSUserDefaults и группы - person Nicholas; 19.01.2015
comment
не стесняйтесь открывать другой вопрос с вашим кодом, я посмотрю на него для вас - person Leo Dabus; 19.01.2015
comment
проблема в том, что невозможно поместить объекты таймера в NSUserDefaults... просто попробуйте поместить таймер в контроллер основного представления в своем коде и вызвать его обратно в виджет сегодняшнего дня...:] - person Nicholas; 19.01.2015
comment
Передача объекта таймера между приложением и его расширением не имеет особого смысла. Почему расширение не может создать собственный объект таймера? - person Tom Harrington; 19.01.2015
comment
@TomHarrington, потому что я хочу видеть один и тот же таймер в основном приложении и в виджете «Сегодня», и я все равно не могу этого сделать, я не могу передать ни NSTimer, ни NSTimerInterval. Почему? - person Nicholas; 19.01.2015
comment
@ Николас, как я уже сказал, это еще один вопрос. Идите вперед и откройте новый вопрос. - person Leo Dabus; 19.01.2015
comment
@LeonardoSavioDabus Кажется, я сделал это! На данный момент я дам положительный ответ, большое спасибо. Я мог бы открыть еще один вопрос! - person Nicholas; 19.01.2015
comment
@Nicholas, как я уже сказал, передавать NSTimer не имеет смысла. NSTimer вызывает метод только для объекта, а объекты могут существовать только в одном процессе. Даже если бы вы могли пройти NSTimer, это не имело бы смысла. Тем не менее, должна быть возможность сохранить NSTimeInterval для пользовательских значений по умолчанию, если вам нужно передавать значение туда и обратно. - person Tom Harrington; 20.01.2015
comment
@TomHarrington, когда я опубликую свое приложение, я покажу вам, зачем мне это нужно. Спасибо, в любом случае - person Nicholas; 20.01.2015
comment
Было бы чрезвычайно интересно узнать, почему вы считаете, что вам нужно передавать объект NSTimer между двумя процессами, и почему использование NSTimeInterval недостаточно. - person Tom Harrington; 20.01.2015
comment
Это неправда, я даже не открываю свое приложение и вижу, как работает таймер - person Leo Dabus; 24.01.2015
comment
это решение работает довольно хорошо, но единственная проблема связана с методом viewDidLoad(), этот метод вызывается каждый раз, когда пользователь проводит пальцем по экрану просмотра «Сегодня». Таким образом, было запланировано несколько таймеров. По одному на каждый раз, когда вы проводите пальцем по экрану просмотра «Сегодня» ... - person Mike D3ViD Tyson; 01.08.2019
comment
Существует только один экземпляр таймера. Вы можете просто аннулировать () таймер, чтобы убедиться, что вы не добавили его дважды в цикл выполнения. - person Leo Dabus; 02.08.2019
comment
Сделал это. Нет эффекта. - person J A S K I E R; 25.06.2020
comment
@ Александр, ты нашел способ избежать нескольких таймеров? - person hyouuu; 04.10.2020

Я знаю, что это вопрос Swift, но я обнаружил, что он ищет код Objective-C, и другие тоже могут.

-(void) viewDidLoad
{
    [NSTimer scheduledTimerWithTimeInterval:1 // update more than once a second to appear in sync with the system clock
                                     target:self
                                   selector:@selector(updateUi:)
                                   userInfo:nil
                                    repeats:YES];

}


-(void) updateUi:(NSTimer *)timer 
{
   // Update Widget UI as required
}
person lewis    schedule 20.09.2015
comment
Нет необходимости увеличивать интервал, чтобы он отображался синхронно. Вы можете запланировать запуск таймера в следующую четную секунду. - person Leo Dabus; 30.07.2020
comment
как ты это делаешь @LeoDabus? - person lewis; 30.07.2020
comment
Это показывает, как это сделать без секунд, но вы можете легко изменить синхронизацию секунд. stackoverflow.com/a/61299018/2303865 - person Leo Dabus; 30.07.2020