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

ActionSheet не работает iPad

Я использую ActionSheet в своем приложении. На моем iPhone это работает, но это не на симуляторе iPad.

это мой код:

@IBAction func dialog(sender: AnyObject) {

    let optionMenu = UIAlertController(title: nil, message: "Choose Option", preferredStyle: .ActionSheet)
    let deleteAction = UIAlertAction(title: "Delete", style: .Default, handler: {

        (alert: UIAlertAction!) -> Void in
        println("Filtre Deleted")
    })

    let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: {
        (alert: UIAlertAction!) -> Void in
        println("Cancelled")
    })

    optionMenu.addAction(deleteAction)
    optionMenu.addAction(cancelAction)

    self.presentViewController(optionMenu, animated: true, completion: nil)
}

И моя ошибка:

Завершение приложения из-за неотображенного исключения "NSGenericException", причина: "Ваша заявка представила UIAlertController () стиля UIAlertControllerStyleActionSheet. Модальное представление UIAlertController с этим стилем - UIModalPresentationPopover. Вы должен предоставить информацию о местоположении для этого popover через предупреждение контроллер popoverPresentationController. Вы должны предоставить sourceView и sourceRect или barButtonItem. Если эта информация неизвестно, когда вы представляете контроллер предупреждения, вы можете предоставить его в метод UIPopoverPresentationControllerDelegate -prepareForPopoverPresentation '.

4b9b3361

Ответ 1

Вам нужно предоставить исходное представление или кнопку перед представлением опцииMenu, поскольку на iPad его UIPopoverPresentationController, как говорится в вашей ошибке. Это просто означает, что ваш лист действий указывает на кнопку, позволяющую пользователю узнать, откуда она началась.

Например, если вы представляете свой вариантMenu, нажав на правый элемент навигационной панели. Вы можете сделать что-то вроде этого:

optionMenu.popoverPresentationController?.barButtonItem = self.navigationItem.rightBarButtonItem

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

или вы можете установить такой вид: (вам просто нужно одно из них 2)

optionMenu.popoverPresentationController?.sourceView = yourView

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

Также имейте в виду, что если вы измените свой UIAlertControllerStyle на Alert вместо листа действий, вам не нужно будет указывать это. Я уверен, что вы, должно быть, поняли это, но я просто хотел помочь любому, кто попадает на эту страницу.

Ответ 2

Swift 3

Как уже говорилось, вы должны настроить UIAlertController для представления в определенной точке на iPAD.

Пример для панели навигации:

    // 1
    let optionMenu = UIAlertController(title: nil, message: "Choose an option", preferredStyle: .actionSheet)

    // 2
    let deleteAction = UIAlertAction(title: "Option 1", style: .default, handler: {
        (alert: UIAlertAction!) -> Void in
        print("option 1 pressed")
    })
    let saveAction = UIAlertAction(title: "Option 2", style: .default, handler: {
        (alert: UIAlertAction!) -> Void in
        print("option 2 pressed")
    })

    //
    let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: {
        (alert: UIAlertAction!) -> Void in
        print("Cancelled")
    })


    // 4

    optionMenu.addAction(deleteAction)
    optionMenu.addAction(saveAction)
    optionMenu.addAction(cancelAction)

    // 5

    optionMenu.popoverPresentationController?.barButtonItem = self.navigationItem.rightBarButtonItem

    self.present(optionMenu, animated: true) { 
        print("option menu presented")
    }

Ответ 3

Такая же проблема для меня. У меня был UIAlertController, который отлично работал на телефоне, но разбился на iPad. Лист всплывает, когда ячейка извлекается из представления таблицы.

Для Swift 3 я добавил 3 строки кода прямо перед тем, как представить:

        ...

        sheet.popoverPresentationController?.sourceView = self.view
        sheet.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection()
        sheet.popoverPresentationController?.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0)


        self.present(sheet, animated: true, completion: nil)

Ответ 4

добавить выражения в следующих выражениях перед представлением.

optionMenu.popoverPresentationController.sourceView = self.view; optionMenu.popoverPresentationController.sourceRect = CGRectMake (0,0,1.0,1.0);

@IBAction func dialog(sender: AnyObject) {
    ...

    optionMenu.popoverPresentationController.sourceView = self.view;
    optionMenu.popoverPresentationController.sourceRect = CGRectMake(0,0,1.0,1.0);

    self.presentViewController(optionMenu, animated: true, completion: nil)
}

он будет работать хорошо.

Ответ 5

Просто обратите внимание, что вы также можете получить эту ошибку, если вы не связали исходное изображение в IB с соответствующей переменной в своем приложении.