web-dev-qa-db-ja.com

UITableViewCellからのUIAlertControllerの提示

カスタムUITableViewCellにアラートを追加してUIAlertViewを表示しようとしています。UIViewControllerからpresentViewControllerを呼び出す必要があります。しかし、私はUIViewControllerクラスから現在のUITableViewCellインスタンスにアクセスする方法を知りません。以下のコードは、拡張機能を使用してこれを行う私の私の試みです。

私はこのエラーを受け取ります

式は未使用の関数に解決されました。

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 {
16

この拡張機能を使用して、セルを表示するviewControllerを見つけることができます

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
}
}

またはrootViewControllerを使用してプレゼンします:

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

Swift 4.2アップデート

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
    }
}

またはrootViewControllerを使用してプレゼンします:

UIApplication.shared.keyWindow?.rootViewController?.present(alertVC, animated: true, completion: nil)
40
Leo

次のコード行に置き換えてみてください。

Swift 2

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

Swift

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

これを行う別の方法は、テーブルビューセルクラスでプロトコルとデリゲートプロパティを宣言し、コントローラーをセルデリゲートとして設定し、アラートビューコントローラーを提示できるコントローラーにプロトコルを実装することです。

10
dulgan

レオの解決策は私にとってうまくいきました。カスタムコレクションビューセルからAlertViewを表示するために使用しました。

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
    }
}

それが役に立てば幸い。

9
Edouard Barbier

この方法を使用してプロトコルとデリゲートを試してみると、アラートを表示するだけでなく、将来必要になる場合に備えてView Controllerとのやり取りが改善される可能性があります。例えば:

protocol alerts: class{

    func presentAlert(title:String, message:String)

}

次に、tableViewCellで次のようなものを作成します。

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")

次に、viewControllerで、最初にviewControllerをアラートとして設定します

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

    }
}

次に、「cellForRowAt」メソッドでセルのデリゲートを設定します

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

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

    cell.alertsDelegate = self

}

そして、これと同じように、viewControllerまたはviewControllersとの通信に関連してニーズを適応させる複数の関数を作成できます。

3
reojased

CustomTableViewCell Class and called these properties at the place of UIAlertViewControllerでプロトコルとそのデリゲートプロパティを宣言し、UIViewControllerでこれらのプロトコルプロパティを実装する必要があります。

0
Rakesh Kunwar