iOS在UIView获取UIViewController

本文介绍了在Swift中如何从UITableViewCell实例中找到其所属的UIViewController,以便直接在cell内触发界面跳转。提供了几种实现方法,包括遍历 UIResponder 链、通过 AppDelegate 获取可见的 ViewController 和递归查找等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在我的项目中遇到了cell中有点击响应事件,需要推出一个新的带导航栏UIViewController,但是cell是继承View的,不能推出界面。最初使用的是代理,调用父类ViewController去执行推出,但是中间遇到了问题,而且cell过多,使用代理过多出现了混乱。
于是就在cell中进行推出新界面,这就用到了View获区UIViewController的方法(后面几个方法是从网上查到,未测试过,写到一起为了方便以后查阅)
1、

UIResponder *objc = self.nextResponder;
    while (objc != nil && ![objc isKindOfClass:[BasicViewController class]]) {
        objc = objc.nextResponder;
    }
    BasicViewController *baseVC = (BasicViewController *)objc;

    ScrollImageViewController * ScrollVC = [[ScrollImageViewController alloc]init];

    ScrollVC.page = tagInt;
    ScrollVC.Array = imageMuarr;

    [baseVC.navigationController pushViewController:ScrollVC animated:YES];

2、

//nav为root UINavigationController
UIViewController *viewController = ((AppDelegate *)[UIApplication sharedApplication].delegate).nav.visibleViewController;

3、

- (UIViewController *)recursionView2ViewController:(UIView *)view
{
    __block UIViewController *viewController;
    __block void (^blocks)(UIView *) = nil;
    blocks = ^(UIView *view)
    {
        if([view.superview isKindOfClass:NSClassFromString(@"UIViewControllerWrapperView")])
        {
            Ivar ivar = class_getInstanceVariable([UIView class], "_viewDelegate");
            viewController = object_getIvar(view, ivar);
        }
        else blocks(view.superview);
    };
    blocks(view);
    return viewController;
}

4、

- (UIViewController *)findViewController:(UIView *)sourceView
{
    id target=sourceView;
    while (target) {
        target = ((UIResponder *)target).nextResponder;
        if ([target isKindOfClass:[UIViewController class]]) {
            break;
        }
    }
    return target;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值