watchos иногда не показывает изображение - PullRequest
1 голос
/ 30 сентября 2019

Я создал очень простое приложение, которое должно показывать изображение и таймер, когда приложение становится активным.

У меня есть несколько изображений, хранящихся в расширении 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

некоторые изображения для иллюстрации:

интерфейс раскадровки: interface storyboard

симулятор до и после нескольких (например, от 15 до 20) пролистываний

enter image description here

и некоторый код

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()
    }

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...