如何为UITableViewCell找到ViewController?

时间:2018-05-14 15:38:15

标签: ios objective-c

我需要从ViewController引用UITableViewCell以显示外部类UIAlertController

我如何找到该参考?

3 个答案:

答案 0 :(得分:1)

你可以尝试

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

答案 1 :(得分:1)

走上响应者链,直到你来到视图控制器。一旦你拥有作为视图控制器的响应者,将其转发到视图控制器类并从那里开始。

UIResponder* r = myTableViewCell;
while (![r isKindOfClass: [UIViewController class]])
    r = [r nextResponder];
[(UIViewController*)r presentViewController:myAlert animated:YES completion:nil];

答案 2 :(得分:1)

您可以使用响应程序链从UIViewController获取UITableViewCell的实例。
响应者链:
响应者链是一系列链接的响应者对象。它从第一个响应者开始,以app对象结束。如果第一响应者无法处理事件,则它将事件转发给响应者链中的下一个响应者。响应者对象是一个可以响应和处理事件的对象。

我认为以下UITableViewCell扩展可能对您有所帮助。
Objective-C版本:
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

您可以在UITableViewCell对象中调用以下代码。

 #import "UIView+ParentViewController.h"

 ViewController *parentViewController = cell.parentViewController;
 if (parentViewController){
     [parentViewController:objAlert animated:YES completion:nil];
 }


Swift版本:

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
    }
}

您可以在UITableViewCell对象中调用以下代码。

 if let parentViewController = cell.parentViewController as? ViewController {
    self.present(objAlert, animated: true, completion: nil)
}