2015-05-27 3 views
9

Я пытаюсь добавить оповещения к таможне UITableViewCell, чтобы представить UIAlertView Мне нужно позвонить presentViewController с UIViewController. Тем не менее, я не знаю, как получить доступ к текущему экземпляру UIViewController из класса UITableViewCell. Следующий код - это моя попытка сделать это с расширением.Представляя UIAlertController от UITableViewCell

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

Expression разрешенного к неиспользуемой функции.

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 { 

ответ

24

Вы можете использовать это расширение, чтобы найти 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)

11

Попробуйте заменить на эту строку кода:

Swift 2

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

Swift 3

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

wow супер hack гений boy! – mattyU

+0

Спасибо, друзья за ваши удивительные усилия. – Jaydip

+0

Это не сработало, так как мое табличное представление было также в контроллере навигации. Я смог представить, если пусть topController = UIApplication.topViewController() { topController.present (alertController, animated: true, completion: noil) } – DoesData

9

Другой способ сделать это, чтобы объявить протокол и свойство делегата в классе ячеек таблицы, установите контроллер как делегат ячеек и реализуйте протокол в контроллере, который может представить контроллер представления предупреждений.

+1

Я думаю, что этот подход является самым чистым. – jrf

+0

Но если вы хотите управлять некоторыми элементами управления в tableviewcell после того, как предупреждение уволено, у вас не будет доступа к ним. –

7

Решение Льва работало для меня. Я использовал его для представления 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 
    } 
} 

Надеется, что это помогает.

+1

Отлично !!! это отлично работает ... – Annjawn

+0

работает действительно красиво –

0

Вы можете попробовать использовать протокол, и делегат, используя этот метод, предоставит вам возможность не только представлять оповещения, но и дать вам лучшее взаимодействие с вашим контроллером просмотра, если вам это нужно в будущем. Например:

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.