カスタム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 {
この拡張機能を使用して、セルを表示する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)
次のコード行に置き換えてみてください。
Swift 2
UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(refreshAlert, animated: true, completion: nil)
Swift
UIApplication.shared.keyWindow?.rootViewController?.present(refreshAlert, animated: true, completion: nil)
これを行う別の方法は、テーブルビューセルクラスでプロトコルとデリゲートプロパティを宣言し、コントローラーをセルデリゲートとして設定し、アラートビューコントローラーを提示できるコントローラーにプロトコルを実装することです。
レオの解決策は私にとってうまくいきました。カスタムコレクションビューセルから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
}
}
それが役に立てば幸い。
この方法を使用してプロトコルとデリゲートを試してみると、アラートを表示するだけでなく、将来必要になる場合に備えて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との通信に関連してニーズを適応させる複数の関数を作成できます。
CustomTableViewCell Class and called these properties at the place of UIAlertViewController
でプロトコルとそのデリゲートプロパティを宣言し、UIViewController
でこれらのプロトコルプロパティを実装する必要があります。