我正在尝试向自定义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 {
答案 0 :(得分:33)
您可以使用此扩展程序查找显示单元格的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
}
}
UIApplication.shared.keyWindow?.rootViewController?.present(alertVC, animated: true, completion: nil)
答案 1 :(得分:13)
尝试替换这行代码:
Swift 2
UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(refreshAlert, animated: true, completion: nil)
Swift 3
UIApplication.shared.keyWindow?.rootViewController?.present(refreshAlert, animated: true, completion: nil)
答案 2 :(得分:10)
另一种方法是在表视图单元类中声明协议和委托属性,将控制器设置为单元委托,并在控制器中实现协议,该协议能够呈现警报视图控制器。
答案 3 :(得分:8)
Leo的解决方案对我有用。我用它来自自定义集合视图单元格中呈现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
}
}
希望它有所帮助。
答案 4 :(得分:1)
您可以尝试使用协议,并且使用此方法进行委派将使您不仅可以提供警报,还可以在将来需要时与视图控制器进行更好的交互。例如:
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的通信需求。
答案 5 :(得分:0)
必须在CustomTableViewCell Class and called these properties at the place of UIAlertViewController
中声明协议及其委托属性,并在UIViewController
中实现这些协议属性。