new2ios
new2ios

Reputation: 1350

How to find ViewController for UITableViewCell?

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

Answers (3)

MobileMatrix
MobileMatrix

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

Shehata Gamal
Shehata Gamal

Reputation: 100523

You can try

[[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:alert animated:true completion:nil];

Upvotes: 1

matt
matt

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

Related Questions