web-dev-qa-db-fra.com

Présentation de UIAlertController de UITableViewCell

J'essaie d'ajouter des alertes à une UITableViewCell personnalisée afin de présenter une UIAlertView Il est nécessaire d'appeler presentViewController depuis UIViewController. Cependant, je ne sais pas comment accéder à l'instance actuelle UIViewController à partir de la classe UITableViewCell. Le code ci-dessous est ma tentative de le faire avec une extension. 

Je reçois cette erreur 

Expression résolue en fonction non utilisée.

extension UIViewController
{

    class func alertReminden(timeInterval: Int)
    {
        var refreshAlert = UIAlertController(title: "Refresh", message: "All data will be lost.", preferredStyle: UIAlertControllerStyle.Alert)

        refreshAlert.addAction(UIAlertAction(title: "Ok", style: .Default, handler: { (action: UIAlertAction!) in
            Alarm.createReminder("Catch the Bus",
                timeInterval: NSDate(timeIntervalSinceNow: Double(timeInterval * 60)))
        }))

        refreshAlert.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: { (action: UIAlertAction!) in
            println("Handle Cancel Logic here")
        }))

        UIViewController.presentViewController(refreshAlert)


    }
}

class CustomRouteViewCell: UITableViewCell {
13

Vous pouvez utiliser cette extension pour trouver le viewController qui présente la cellule

extension UIView {
var parentViewController: UIViewController? {
    var parentResponder: UIResponder? = self
    while parentResponder != nil {
        parentResponder = parentResponder!.nextResponder()
        if parentResponder is UIViewController {
            return parentResponder as! UIViewController!
        }
    }
    return nil
}
}

Ou utilisez rootViewController to Present:

UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(refreshAlert, animated: true, completion: nil)

33
Leo

Essayez de remplacer cette ligne de code:

Swift 2

UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(refreshAlert, animated: true, completion: nil)

Swift 3

UIApplication.shared.keyWindow?.rootViewController?.present(refreshAlert, animated: true, completion: nil)
12
Bannings

Pour ce faire, vous pouvez également déclarer un protocole et une propriété délégué dans la classe de cellules de la vue table, définir le contrôleur en tant que délégué des cellules et implémenter le protocole dans le contrôleur capable de présenter le contrôleur de vue d'alerte.

10
dulgan

La solution de Leo a fonctionné pour moi. Je l'ai utilisé pour présenter un AlertView à partir d'une cellule de vue de collection personnalisée.

Mise à jour pour Swift 3.0: 

extension UIView {
    var parentViewController: UIViewController? {
        var parentResponder: UIResponder? = self
        while parentResponder != nil {
            parentResponder = parentResponder!.next
            if parentResponder is UIViewController {
                return parentResponder as! UIViewController!
            }
        }
        return nil
    }
}

J'espère que ça aide.

8
Edouard Barbier

Vous pouvez essayer d’utiliser un protocole, et déléguer, en utilisant cette méthode, vous donnera l’occasion non seulement de présenter des alertes, mais également une meilleure interaction avec votre contrôleur de vue au cas où vous en auriez besoin ultérieurement. Par exemple:

protocol alerts: class{

    func presentAlert(title:String, message:String)

}

Ensuite, dans votre tableViewCell, vous créerez quelque chose comme:

var alertsDelegate : alerts? 

//And whenever you need to present a message call something inside the cell like:

alertsDelegate?.presentAlert(title:"Your title", message:"Your message")

Ensuite, dans votre viewController, commencez par définir votre viewController en tant qu'alerte.

class yourClassName : ViewController, alerts {

    //And add the functions of the protocol
    func presentAlert(title:String, message:String){
        //This is the function that'll be called from the cell
        //Here you can personalize how the alert will be displayed

    }
}

Deuxièmement, définissez le délégué pour la cellule dans la méthode "cellForRowAt"

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "yourIdentifier") as! yourCellClass

    cell.alertsDelegate = self

}

Et comme cela, vous pouvez créer plusieurs fonctions qui répondent à vos besoins en matière de communication avec votre viewController ou viewControllers.

0
reojased