Reputation: 1350
I need a reference to the ViewController
from a UITableViewCell
to show UIAlertController
from external class.
How can I find that reference?
Upvotes: 2
Views: 3006
Reputation: 162
You can get an instance of UIViewController
from UITableViewCell
using responder chain.
Responder chain :
The responder chain is a series of linked responder objects. It starts with the first responder and end with the app object. If the first responder cannot handle an event, it forwards the event to the next responder in the responder chain. A responder object is an object that can respond to and handle events.
I think below UITableViewCell extension may help you.
Objective-C Version:
UITableViewCell+ParentViewController.h
@interface UITableViewCell (ParentViewController)
-(UIViewController *)parentViewController;
@end
UITableViewCell+ParentViewController.m
@implementation UITableViewCell (ParentViewController)
-(UIViewController *)parentViewController{
UIResponder *parentResponder = nil;
while (parentResponder != nil) {
parentResponder = parentResponder.nextResponder;
if ([parentResponder isKindOfClass:[UITableViewCell class]]) {
UIViewController *parentViewController = (UIViewController *)parentResponder;
return parentViewController;
}
}
return nil;
}
@end
you can call below code inside in your UITableViewCell object.
#import "UIView+ParentViewController.h"
ViewController *parentViewController = cell.parentViewController;
if (parentViewController){
[parentViewController:objAlert animated:YES completion:nil];
}
Swift Version:
extension UITableViewCell {
var parentViewController: UIViewController? {
var parentResponder: UIResponder? = self
while parentResponder != nil {
parentResponder = parentResponder!.next
if let viewController = parentResponder as? UIViewController {
return viewController
}
}
return nil
}
}
you can call below code inside in your UITableViewCell object.
if let parentViewController = cell.parentViewController as? ViewController {
self.present(objAlert, animated: true, completion: nil)
}
Upvotes: 3
Reputation: 100523
You can try
[[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:alert animated:true completion:nil];
Upvotes: 1
Reputation: 535325
Walk up the responder chain until you come to the view controller. Once you have the responder that is the view controller, cast it down to a view controller class and go from there.
UIResponder* r = myTableViewCell;
while (![r isKindOfClass: [UIViewController class]])
r = [r nextResponder];
[(UIViewController*)r presentViewController:myAlert animated:YES completion:nil];
Upvotes: 2