UIDatePicker setEnabled должен использоваться только из основного потока - PullRequest
0 голосов
/ 27 ноября 2018

Я хочу, чтобы некоторые объекты стали неактивными и прозрачными после нажатия «Не разрешать» для уведомлений.Тем не менее, у меня есть ошибка, как на изображении ниже.Как я могу решить эту проблему?

screenshot

override func viewDidLoad() {
    super.viewDidLoad()

    if let savedFirstNotification = savedFirstNotification {
        firstDatePicker.date = savedFirstNotification
    }

    if let savedSecondNotification = savedSecondNotification {
        secondDatePicker.date = savedSecondNotification
    }

    let center = UNUserNotificationCenter.current()
    center.requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in
        if granted {
            print("Yep")
        } else {
            print("No")
            self.notEnable()
        }
    }
}

func notEnable() {
    firstDatePicker.isEnabled = false
    firstDatePicker.alpha = 0.5

    secondDatePicker.alpha = 0.5
    secondDatePicker.isEnabled = false

    scheludeMeal.alpha = 0.5
    scheludeMeal.isEnabled = false
}

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Вы должны позвонить notEnable() в основном потоке:

DispatchQueue.main.async {
    self.notEnable()
}
0 голосов
/ 27 ноября 2018

Переключение свойства isEnabled UIView должно выполняться из основного потока, поскольку это изменяет пользовательский интерфейс, что может происходить только из основного потока.Вам необходимо отправить вызов на notEnable в основной поток, используя DispatchQueue.main.async.Закрытие requestAuthorization, похоже, выполняется в фоновом потоке, поэтому возникает ошибка при попытке обновить интерфейс пользователя из этого закрытия.

center.requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in
    if granted {
        print("Yep")
    } else {
        print("No")
        DispatchQueue.main.async{
            self.notEnable()
        }
    }
}
...