Мне было интересно, можно ли обновить текстовую метку таймера в виджете «Сегодня». Я огляделся, но ничего не помогло мне.
Можно ли обновить таймер в виджете «Сегодня»?
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
спасибо за ваш ответ, я должен поместить это в свой код, так как мой таймер работает в контроллере основного представления, и я пытаюсь передать этот таймер из контроллера представления в сегодняшнее представление, используя NSUserDefaults и группы
- person Nicholas; 19.01.2015
не стесняйтесь открывать другой вопрос с вашим кодом, я посмотрю на него для вас
- person Leo Dabus; 19.01.2015
проблема в том, что невозможно поместить объекты таймера в NSUserDefaults... просто попробуйте поместить таймер в контроллер основного представления в своем коде и вызвать его обратно в виджет сегодняшнего дня...:]
- person Nicholas; 19.01.2015
Передача объекта таймера между приложением и его расширением не имеет особого смысла. Почему расширение не может создать собственный объект таймера?
- person Tom Harrington; 19.01.2015
@TomHarrington, потому что я хочу видеть один и тот же таймер в основном приложении и в виджете «Сегодня», и я все равно не могу этого сделать, я не могу передать ни NSTimer, ни NSTimerInterval. Почему?
- person Nicholas; 19.01.2015
@ Николас, как я уже сказал, это еще один вопрос. Идите вперед и откройте новый вопрос.
- person Leo Dabus; 19.01.2015
@LeonardoSavioDabus Кажется, я сделал это! На данный момент я дам положительный ответ, большое спасибо. Я мог бы открыть еще один вопрос!
- person Nicholas; 19.01.2015
@Nicholas, как я уже сказал, передавать
NSTimer
не имеет смысла. NSTimer
вызывает метод только для объекта, а объекты могут существовать только в одном процессе. Даже если бы вы могли пройти NSTimer
, это не имело бы смысла. Тем не менее, должна быть возможность сохранить NSTimeInterval
для пользовательских значений по умолчанию, если вам нужно передавать значение туда и обратно.
- person Tom Harrington; 20.01.2015
@TomHarrington, когда я опубликую свое приложение, я покажу вам, зачем мне это нужно. Спасибо, в любом случае
- person Nicholas; 20.01.2015
Было бы чрезвычайно интересно узнать, почему вы считаете, что вам нужно передавать объект
NSTimer
между двумя процессами, и почему использование NSTimeInterval
недостаточно.
- person Tom Harrington; 20.01.2015
Это неправда, я даже не открываю свое приложение и вижу, как работает таймер
- person Leo Dabus; 24.01.2015
это решение работает довольно хорошо, но единственная проблема связана с методом
viewDidLoad()
, этот метод вызывается каждый раз, когда пользователь проводит пальцем по экрану просмотра «Сегодня». Таким образом, было запланировано несколько таймеров. По одному на каждый раз, когда вы проводите пальцем по экрану просмотра «Сегодня» ...
- person Mike D3ViD Tyson; 01.08.2019
Существует только один экземпляр таймера. Вы можете просто аннулировать () таймер, чтобы убедиться, что вы не добавили его дважды в цикл выполнения.
- person Leo Dabus; 02.08.2019
Сделал это. Нет эффекта.
- person J A S K I E R; 25.06.2020
@ Александр, ты нашел способ избежать нескольких таймеров?
- 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
Нет необходимости увеличивать интервал, чтобы он отображался синхронно. Вы можете запланировать запуск таймера в следующую четную секунду.
- person Leo Dabus; 30.07.2020
как ты это делаешь @LeoDabus?
- person lewis; 30.07.2020
Это показывает, как это сделать без секунд, но вы можете легко изменить синхронизацию секунд. stackoverflow.com/a/61299018/2303865
- person Leo Dabus; 30.07.2020