iOS事件响应链

2020-07-16  本文已影响0人  哥只是个菜鸟

UIView-->ViewController-->UIWindow-->UIAplication-->AppDelagate

UIView和UICLayer

通过视图(view)获取该视图所在的控制器,通过响应链原理查找

+ (nullable UIViewController *)findBelongViewControllerForView:(UIView *)view {
    UIResponder *responder = view;
    while ((responder = [responder nextResponder]))
        if ([responder isKindOfClass: [UIViewController class]]) {
            return (UIViewController *)responder;
        }
    return nil;
}

获取当前控制器

- (UIViewController *)findCurrentViewController{
    UIViewController *vc = [UIApplication sharedApplication].keyWindow.rootViewController;
    while (1){
        if (vc.presentedViewController) {
            vc = vc.presentedViewController;
        } else if ([vc isKindOfClass:[UITabBarController class]]) {
            vc = ((UITabBarController*)vc).selectedViewController;
        } else if ([vc isKindOfClass:[UINavigationController class]]) {
            vc = ((UINavigationController*)vc).visibleViewController;
        } else {
            break;
        }
    }
    return vc;
}

如何在多次presentViewController后直接返回到指定层

UIViewController *controller = self;
    while(controller.presentingViewController != nil){
        controller = controller.presentingViewController;
    }
    [controller dismissViewControllerAnimated:YES completion:nil];

push之后时删除当前页面

 NSMutableArray *controllers = [[self.navigationController viewControllers]mutableCopy];
               for (UIViewController *vc in controllers) {
                             if ([vc isKindOfClass:[@"xxx" class]]) {
                                 [controllers removeObject:vc];
                                 break;
                             }
                         }
 [controllers addObject:vc];
 self.navigationController. viewControllers=controllers;
上一篇 下一篇

猜你喜欢

热点阅读