Обработчик UIAlertAction слишком поздно — как я могу сделать это немедленно?

Я пытаюсь (...) добавить звуковой эффект к кнопкам, добавленным в UIAlertController. Я запускаю звуковой эффект в обработчике, но на самом деле это уже слишком поздно. Звук срабатывает на 0,5 секунды позже. Я хочу, чтобы звук срабатывал, как только оповещение будет закрыто, а не после его закрытия. С UIAlertView это можно было обработать с помощью alertWillDismiss... вместо alertDidDismiss.

Я что-то пропустил?


person Jonny    schedule 17.02.2016    source источник
comment
Связанный stackoverflow.com/questions/32441856/   -  person Jonny    schedule 17.02.2016
comment
Если вы считаете, что у вас есть хороший вариант использования, отправьте отчет об ошибке в Apple!   -  person matt    schedule 17.02.2016
comment
Я попытался войти на сайт bugreport.apple.com, но получил только Произошла ошибка. Чтобы получить доступ к Apple Bug Reporter, обратитесь в службу поддержки Apple Developer Program. Думаю, меня вообще ненавидят. Или все мы такие.   -  person Jonny    schedule 17.02.2016
comment
Я полагаю, что они не добавили эту функцию из-за этой проблемы: stackoverflow.com/questions/ 25932589/ — обработчик не сможет открыть другой uialertcontroller, если предыдущий еще не полностью закрыт — при использовании одного и того же uiviewcontroller для открытия обоих предупреждений. Только мои предположения.   -  person Jonny    schedule 19.02.2016


Ответы (3)


Нет, ты ничего не пропустил. Функциональность, которую вы ищете, не предоставляется UIAlertController. Подумайте о том, чтобы предоставить свой собственный представленный контроллер представления, над которым у вас будет точный контроль, который вам нужен.

person matt    schedule 17.02.2016
comment
Стоит отметить, что может быть легко создать подкласс UIAlertController и переопределить viewWillDisappear, но этот класс может стать окончательным в будущем. - person Patrick Goley; 17.02.2016

Я воспользовался предложением Патрика Голи, а именно создать подкласс UIAlertController и переопределить viewWillDisappear. Отлично сработало для меня.

//
//  ImmediateClickAlertController.swift
//
//  This subclass of UIAlertController plays a click immediately whenever it is dismissed (i.e. when a button is tapped).
//  This fixes an issue when trying to play a click in an attached UIAlertAction, which does not happen until after its view disappears.

import AudioToolbox

class ImmediateClickAlertController: UIAlertController {

    override func viewWillDisappear(animated: Bool) {
        super.viewWillDisappear(animated)
        // play a click
        let pressKeySystemSoundID: SystemSoundID = 1104
        AudioServicesPlaySystemSound(pressKeySystemSoundID)
    }
}
person Charlie Hitchcock    schedule 23.04.2016

Немного хакерства, но, возможно, вы могли бы:

  1. Попробуйте получить ссылку на кнопку оповещения (путем обхода дерева иерархии, по общему признанию, частного представления) и
  2. Используйте KVO для обнаружения любых изменений его свойств selected и/или highlighted (мой собственный опыт показывает, что selected нельзя надежно наблюдать, а highlighted можно).

... но все это довольно хрупко, не элегантно, может сломаться в будущей версии ОС и/или привести к отказу от магазина приложений...?

Итак, ваш лучший вариант (даже если он самый трудоемкий) - это свернуть свой собственный контроллер модального представления:

person Nicolas Miari    schedule 17.02.2016