用户导航到新视图控制器时截取

时间:2016-09-14 18:53:38

标签: ios objective-c cocoa-touch uiviewcontroller

我正在开发一个应用程序,我需要弄清楚用户是否移动到新的viewcontoller,这将包括如果出现一个新的视图控制器或当你回到一个早期的视图控制器时,我已经尝试过实现这有一个UIViewController类和拦截用户通过覆盖“viewDidAppear”导航到页面,但我不想使用类别来执行此操作,因为对每个视图控制器都有很大影响,有没有办法我能够这样做?

示例:因此我们正在努力将您的应用程序屏幕分享给客户服务代表,代表有自己的规则,例如,在应用程序中有2个页面,当客户共享他的应用程序屏幕并且在第1页时,我将检查规则并确定代表是否应该看到该页面,当客户导航到第2页并且代表无权查看此内容时,我将暂停屏幕共享,因为我意识到第2页不是代表的权限,现在当我回到第1页时,我将需要再次检查权限并显示要转发的页面(基本上恢复屏幕共享)

2 个答案:

答案 0 :(得分:1)

我通过以下方式解决了这个问题,我有一个" CADisplayLink"如下

我创建了属性

@property(nonatomic, strong) UIViewController *topViewController;//This will essentially be the visible view controller at any time
@property(nonatomic, strong) CADisplayLink *displayLink;

然后我实例化" displayLink"

self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(checkTopViewController)];
self.displayLink.frameInterval = 2;//I want the refresh rate to be slower than with the UI refresh rate
[self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

- (void)checkTopViewController{
    UIViewController *vc = [self findBestViewController:[UIApplication sharedApplication].keyWindow.rootViewController];
    if (self.topViewController != vc) {
        self.topViewController = vc;
        //Top visible view controller changed
    }
}

-(UIViewController*) findBestViewController:(UIViewController*)vc {

    if (vc.presentedViewController) {

        // Return presented view controller
        return [UIViewController findBestViewController:vc.presentedViewController];

    } else if ([vc isKindOfClass:[UISplitViewController class]]) {

        // Return right hand side
        UISplitViewController* svc = (UISplitViewController*) vc;
        if (svc.viewControllers.count > 0)
            return [UIViewController findBestViewController:svc.viewControllers.lastObject];
        else
            return vc;

    } else if ([vc isKindOfClass:[UINavigationController class]]) {

        // Return top view
        UINavigationController* svc = (UINavigationController*) vc;
        if (svc.viewControllers.count > 0)
            return [UIViewController findBestViewController:svc.topViewController];
        else
            return vc;

    } else if ([vc isKindOfClass:[UITabBarController class]]) {

        // Return visible view
        UITabBarController* svc = (UITabBarController*) vc;
        if (svc.viewControllers.count > 0)
            return [UIViewController findBestViewController:svc.selectedViewController];
        else
            return vc;

    } else {

        // Unknown view controller type, return last child view controller
        return vc;

    }

}

答案 1 :(得分:-2)

有很多方法可以做到这一点。 查看有关Apple设计模式Containers View Controller的文档,以便选择正确的方法。