Не удалось показать UIAlertController из-за - '' 'Приложение попыталось модально представить активный контроллер' - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть приложение, которое отображает документы в UICollectionView. Каждый UICollectionViewCell имеет кнопку (отличную от той, которую выполняет didSelectItemAt). Эта кнопка вызывает пользовательское всплывающее окно, которое я создал с помощью UIViewController. Представлено Over Current Context. Это всплывающее окно представляет список параметров, один из которых включает Delete document. Когда пользователь выбирает эту последнюю опцию, я бы хотел, чтобы появилось UIAlertController для подтверждения удаления. Это проблема, с которой я сталкиваюсь.

Вот мой код:

Я получаю ошибку:

Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «Приложение пыталось представить модально активный контроллер .

ПОЛЬЗОВАТЕЛЬСКИЙ POPUP (UIViewController)

protocol DismissOptionShowDeleteAlert {
    func showDeleteAlert()
}

class MoreOptionsOnPDFViewController: UIViewController, UITableViewDataSource, UITableViewDelegate{

var showDeleteAlertDelegate: DismissOptionShowDeleteAlert!

/ TAP ON ROW
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){

    ...

     }else if indexPath == [0,4]{ // DELETE DOCUMENT

        DispatchQueue.main.async {
            self.dismiss(animated: true) {
                self.showDeleteAlertDelegate.showDeleteAlert()
            }
        }
    }

    ...

}

UICollectionView:

class CollectionViewFolder: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate ,UICollectionViewDelegateFlowLayout, MoreInfoDocument, MoveFolder, ScanObjectMovedFolder, DismissOptionShowDeleteAlert{

// SHOW DELETE CONFIRMATION ALERT
func showDeleteAlert() {

    Alerts.deleteDocumentConfirm(on: self) {
        // DELETE DOCUMENT FROM SERVER
        print("Delete document ...")
    }
}

}

Структура UIAlertController:

import Foundation
import UIKit

struct Alerts {
private static func showBasicAlert(on vc: UIViewController, with title: String, message: String, action: @escaping (() -> ())){

    let alert =  UIAlertController.init(title: title, message: message, preferredStyle: .alert)
    let okAction = UIAlertAction.init(title: "OK", style: .default) { (UIActionAlert) in

        action()
    }

    let cancelAction = UIAlertAction.init(title: "Cancel", style: .cancel, handler: nil)

    alert.addAction(okAction)
    alert.addAction(cancelAction)
    DispatchQueue.main.async {
        vc.present(vc, animated: true, completion: nil)
    }

}


static func deleteDocumentConfirm(on vc: UIViewController, action: @escaping (() -> ())){
    showBasicAlert(on: vc, with: "Please Confirm Delete", message: "", action: action)
}

}    

Ответы [ 3 ]

0 голосов
/ 10 сентября 2018

Вы представляете неправильно. Вы должны представить предупреждение не vc.

Замените ниже своим кодом.

struct Alerts {
private static func showBasicAlert(on vc: UIViewController, with title: String, message: String, action: @escaping (() -> ())){

    let alert =  UIAlertController.init(title: title, message: message, preferredStyle: .alert)
    let okAction = UIAlertAction.init(title: "OK", style: .default) { (UIActionAlert) in

        action()
    }

    let cancelAction = UIAlertAction.init(title: "Cancel", style: .cancel, handler: nil)

    alert.addAction(okAction)
    alert.addAction(cancelAction)
    DispatchQueue.main.async {
        vc.present(alert, animated: true, completion: nil)
    }

}
0 голосов
/ 10 сентября 2018

Заменить ниже строки

vc.present(vc, animated: true, completion: nil)

до

vc.present(alert, animated: true, completion: nil)

0 голосов
/ 10 сентября 2018

Это именно то, что говорит ваша ошибка.Вы, кажется, представляете контроллер вида vc вместо alert из vc

private static func showBasicAlert(on vc: UIViewController, with title: String, message: String, action: @escaping (() -> ())){

    let alert =  UIAlertController.init(title: title, message: message, preferredStyle: .alert)
    let okAction = UIAlertAction.init(title: "OK", style: .default) { (UIActionAlert) in

        action()
    }

    let cancelAction = UIAlertAction.init(title: "Cancel", style: .cancel, handler: nil)

    alert.addAction(okAction)
    alert.addAction(cancelAction)
    DispatchQueue.main.async {
        vc.present(alert, animated: true, completion: nil) // You should be presenting the alert here.
    }

}
...