Подтвердить что ты не робот

Представление экрана действий UIAlertController в Popover на iPhone

Я создаю и представляю ActionSheet следующим образом:

let alertController = UIAlertController(title: nil, message: nil, preferredStyle: .ActionSheet)
alertController.modalPresentationStyle = .Popover

// Add some buttons

alertController.popoverPresentationController?.delegate = self
alertController.popoverPresentationController?.barButtonItem = someBarButton

self.presentViewController(alertController, animated: true, completion: nil)

Это хорошо работает на iPad, но alertController.popoverPresentationController есть nil на iPhone.

Я успешно представил popovers на iPhone с помощью адаптивного стиля segue Present As Popover в построителе интерфейсов и реализовав метод делегата adaptivePresentationStyleForPresentationController, чтобы вернуть правильный UIModalPresentationStyle, но я застрял, как сделайте это в коде с UIAlertController, поскольку на iPhone нет popoverPresentationController

4b9b3361

Ответ 1

UIAlertController не должен быть popover. По-видимому, в комментариях есть некоторые противоречия. Ваш код выше не будет работать, если он действительно соблюдает стиль .Popover. Зачем? Поскольку для объекта popoverPresentationController необходимо установить sourceView и sourceRect, чтобы знать, куда указывать стрелку. Если вы поменяете UIAlertController на UIViewController, он сработает, потому что эти значения не установлены. По иронии судьбы, если вы попробуете принудительно развернуть popoverPresentationController, он сработает:

alertController.modalPresentationStyle = .Popover
alertController.popoverPresentationController!.sourceView = sender // CRASH!!!
alertController.popoverPresentationController!.sourceRect = sender.bounds

Для получения подробной информации о том, как реализовать iPhone popover (для всего остального, кроме UIAlertController), посмотрите на мой сообщение в блоге iPhone Popover.

Тот факт, что контроллер представления popover равен нулю, довольно говорит о том, что он не должен быть popover.

Альтернативный просмотр таблицы

Вы можете рассматривать UITableViewController как замену здесь. Использование стиля Grouped действительно выглядит довольно приятным в popovers.

Выбор

Вы столкнетесь с этой проблемой, возможно, снова и снова, где вы хотите, чтобы пользователь просто выбирал из нескольких вариантов. Я предлагаю вам инкапсулировать любой элемент управления пользовательским интерфейсом, который вы собираетесь использовать, в свой собственный объект-подборщик. Детали реализации того, может ли его вид таблицы или просто состав кнопок быть замаскирован от вызывающего кода, и вы можете иметь обратные вызовы делегата или замыкания, когда происходит выбор по конкретному индексу. Здесь примерно то, что может выглядеть API:

class Picker: UIViewController {
    init(items: [String])
    selectionCompletion: (index: Int, item: String)->Void
}

// Usage:
let picker = Picker(["Answer A","Answer B"])
picker.selectionCompletion = { index, item in
    // handle selection
}

Таким образом, вы можете использовать его везде, где хотите, и API очень прост