Я создал очень простое приложение, которое должно показывать изображение и таймер, когда приложение становится активным.
У меня есть несколько изображений, хранящихся в расширении WatchKit Assets.xcassets
. Я также добавил второй экран интерфейса, который также должен показывать только изображение. Затем я обновляю WKInterfaceImage
с вызовом функции setImageNamed
, но здесь возникает сложная часть, после проведенного сканирования я получаю иногда просто черный экран вместо изображения, также без таймера,вызывается функция override func willActivate()
, но экран просто черный.
Я также провел тест на реальном оборудовании (4 series 44mm with watchos 6
) и получил тот же результат.
версии:
macos 10.14.6
xcode 11.0
swift 5
watchos 6
некоторые изображения для иллюстрации:
интерфейс раскадровки:
симулятор до и после нескольких (например, от 15 до 20) пролистываний
и некоторый код
import WatchKit
import Foundation
import UserNotifications
class InterfaceController: WKInterfaceController {
@IBOutlet weak var activityImage: WKInterfaceImage!
@IBOutlet weak var activityCountdown: WKInterfaceTimer!
// some other irrelevant code
// ....
// ....
override func willActivate() {
// This method is called when watch view controller is about to be visible to user
updateActivityImage()
updateActivityCoundtdown()
super.willActivate()
}
@objc private func updateActivityImage() -> Void {
let currentMinute = Calendar.current.component(.hour, from: Date()) * 60 + Calendar.current.component(.minute, from: Date())
let indexOfNextActivity =
Config
.activities
.map({ activity in return activity.time })
.firstIndex(where: { $0 > currentMinute }) ?? 0
let indexOfCurrentActivity = indexOfNextActivity - 1 < 0 ? Config.activities.count - 1 : indexOfNextActivity - 1
let currentActivity = Config.activities[indexOfCurrentActivity]
if currentActivity.hasCountdown {
self.activityCountdown.setHidden(false)
} else {
self.activityCountdown.setHidden(true)
}
print(currentActivity.image)
self.activityImage.setImageNamed(currentActivity.image)
}
@objc private func updateActivityCoundtdown() -> Void {
let currentMinute = Calendar.current.component(.hour, from: Date()) * 60 + Calendar.current.component(.minute, from: Date())
let indexOfNextActivity =
Config
.activities
.map({ activity in return activity.time })
.firstIndex(where: { $0 > currentMinute }) ?? 0
let nextActivity = Config.activities[indexOfNextActivity]
var nextActivityTime = Calendar.current.dateComponents([.day, .month, .year], from: Date())
// still not fully covered, if the next activity is first in list, means the next acitivty is at another day
if (indexOfNextActivity == 0) {
nextActivityTime.day = nextActivityTime.day! + 1
}
nextActivityTime.hour = Int(nextActivity.time / 60)
nextActivityTime.minute = nextActivity.time % 60
let nextActitivyDate = Calendar.current.date(from: nextActivityTime as DateComponents)!
// set refresh timer at activity end
let countDownTimer = Timer.init(fire: nextActitivyDate, interval: 1, repeats: false, block: { reason in self.updateActivityCoundtdown();
self.updateActivityImage();
})
RunLoop.current.add(countDownTimer, forMode: RunLoop.Mode.common)
self.activityCountdown.setDate(nextActitivyDate)
self.activityCountdown.start()
}
Спасибо!