显示Top ViewController

时间:2014-03-13 13:25:56

标签: ios objective-c xcode5

我正在阅读包含40多个ViewController的应用程序的代码。你怎么知道哪个ViewController是当前的。

我尝试了什么:

  1. CBIntrospect:使用a执行UIAlertView 消息:NSStringFromClass([self class])

  2. 看着添加 NotificationCenter的某些内容,并在视图中执行某些方法 控制器是用管道输送的吗?

  3. 使用runtime.h动态添加 方法

  4. 赞赏任何想法

2 个答案:

答案 0 :(得分:1)

试试这个:

- (UIViewController *)topViewController
{
    return [self topViewController:self.window.rootViewController];
}


- (UIViewController *)topViewController:(UIViewController *)viewController
{
    if (viewController.presentedViewController == nil) {
        return viewController;
    }

    if ([viewController.presentedViewController isKindOfClass:[UINavigationController class]]) {
        UINavigationController *navigationController = (UINavigationController *) viewController.presentedViewController;
        UIViewController       *topViewController    = [navigationController.viewControllers lastObject];
        return [self topViewController:topViewController];
    }

    UIViewController *presentedViewController = viewController.presentedViewController;
    return [self topViewController:presentedViewController];
}

答案 1 :(得分:0)

我经常使用[self.window recursiveDescription]通过我的应用程序打印所有UIViews。这不是VC,但也可能对你有用。

只需在您需要的地方设置断点并输入(用您的密钥“UIWindow”替换窗口):

[window recursiveDescription]

你会看到共同的结果:

<UIWindow: 0xc0275c0; frame = (0 0; 320 568); gestureRecognizers = <NSArray: 0xc027b20>; layer = <UIWindowLayer: 0xc0276e0>>
   | <UILayoutContainerView: 0xc0196b0; frame = (0 0; 320 568); autoresize = W+H; gestureRecognizers = <NSArray: 0xc022fa0>; layer = <CALayer: 0xc019790>>
   |    | <UINavigationTransitionView: 0xc011a60; frame = (0 0; 320 568); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0xc00ebd0>>
   |    |    | <UIViewControllerWrapperView: 0xb34ab10; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0xb34abe0>>
   |    |    |    | <UIView: 0xc44a7c0; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0xc44a820>>
   |    |    |    |    | <UITableView: 0xdb4a000; frame = (0 0; 320 468); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0xc449ac0>; layer = <CALayer: 0xc448550>; contentOffset: {-0, -63}>
   |    |    |    |    |    | <UITableViewWrapperView: 0xc44a440; frame = (0 0; 320 468); autoresize = W+H; layer = <CALayer: 0xc44a510>>
   |    |    |    |    |    |    | <WorkspaceCell: 0xc023a50; baseClass = UITableViewCell; frame = (0 1; 320 44); autoresize = W; layer = <CALayer: 0xc00cad0>>
   |    |    |    |    |    |    |    | <UITableViewCellScrollView: 0xc02c400; frame = (0 0; 320 44); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0xc02c980>; layer = <CALayer: 0xc02c610>; contentOffset: {0, 0}>
   |    |    |    |    |    |    |    |    | <UITableViewCellContentView: 0xc022980; frame = (0 0; 320 43.5); opaque = NO; gestureRecognizers = <NSArray: 0xc02d2f0>; layer = <CALayer: 0xc02b0c0>>
   |    |    |    |    |    |    |    |    |    | <UIImageView: 0xc0233f0; frame = (15 7; 29 29); clipsToBounds = YES; autoresize = RM+TM+BM; userInteractionEnabled = NO; layer = <CALayer: 0xc0291e0>>
   |    |    |    |    |    |    |    |    |    | <UILabel: 0xc0262e0; frame = (60 11; 240 21); text = 'Alterplay'; clipsToBounds = YES; opaque = NO; autoresize = W+RM+TM+BM; userInteractionEnabled = NO; layer = <CALayer: 0xc0276a0>>
   |    |    |    |    |    |    |    |    |    | <UILabel: 0xc023130; frame = (15 7; 29 29); text = 'A'; clipsToBounds = YES; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <CALayer: 0xc0231d0>>
   |    |    |    |    |    |    |    |    | <_UITableViewCellSeparatorView: 0xc02e4e0; frame = (0 43.5; 320 0.5); layer = <CALayer: 0xc02e5b0>>
   |    |    |    |    |    |    |    |    | <_UITableViewCellSeparatorView: 0xc02e850; frame = (0 0; 320 0.5); layer = <CALayer: 0xc02e8c0>>
   |    |    |    |    |    | <UIImageView: 0xc449210; frame = (0 465.5; 320 3.5); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0xc4494a0>>
   |    |    |    |    |    | <UIImageView: 0xc449680; frame = (316.5 414; 3.5 55); alpha = 0; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0xc449760>>
   |    |    |    |    | <UIView: 0xc44a850; frame = (0 518; 320 50); autoresize = W+TM; layer = <CALayer: 0xc44a8b0>>
   |    |    |    |    |    | <UIButton: 0xc4458a0; frame = (75 14; 172 22); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0xc4459d0>>
   |    |    |    |    |    |    | <UIImageView: 0xb359ce0; frame = (27.5 4; 117 14); clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xb359560>>
   |    |    |    |    | <UIView: 0xc44a9f0; frame = (0 468; 320 50); autoresize = LM+RM+TM; layer = <CALayer: 0xc44aa50>>
   |    |    |    |    |    | <UIButton: 0xc447b10; frame = (101 10; 119 30); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0xc447c00>>
   |    |    |    |    |    |    | <UIButtonLabel: 0xb34c1a0; frame = (32 3; 55 24); text = 'Logout'; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xb34c2b0>>
   |    |    |    |    | <UIImageView: 0xc44ab00; frame = (0 424; 320 44); clipsToBounds = YES; opaque = NO; autoresize = LM+RM+TM; layer = <CALayer: 0xc44ab90>>
   |    | <UINavigationBar: 0xc019980; frame = (0 20; 320 44); opaque = NO; autoresize = W; gestureRecognizers = <NSArray: 0xc01b9f0>; layer = <CALayer: 0xc019ae0>>
   |    |    | <_UINavigationBarBackground: 0xc01a180; frame = (0 -20; 320 64); opaque = NO; autoresize = W; userInteractionEnabled = NO; layer = <CALayer: 0xc01a2b0>>
   |    |    |    | <_UIBackdropView: 0xc01c0d0; frame = (0 0; 320 64); opaque = NO; autoresize = W+H; userInteractionEnabled = NO; layer = <_UIBackdropViewLayer: 0xc01dca0>>
   |    |    |    |    | <_UIBackdropEffectView: 0xc01e6b0; frame = (0 0; 320 64); clipsToBounds = YES; opaque = NO; autoresize = W+H; userInteractionEnabled = NO; layer = <CABackdropLayer: 0xc01e970>>
   |    |    |    |    | <UIView: 0xc01f2a0; frame = (0 0; 320 64); hidden = YES; opaque = NO; autoresize = W+H; userInteractionEnabled = NO; layer = <CALayer: 0xc01f400>>
   |    |    |    | <UIImageView: 0xc01a540; frame = (0 64; 320 0.5); userInteractionEnabled = NO; layer = <CALayer: 0xc01a610>>
   |    |    | <UINavigationItemView: 0xc023490; frame = (111.5 8; 97.5 27); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xc023570>>
   |    |    |    | <UILabel: 0xc023920; frame = (0 3; 97.5 22); text = 'Workspaces'; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xc023a20>>
   |    |    | <_UINavigationBarBackIndicatorView: 0xc029150; frame = (8 12; 12.5 20.5); alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xc029240>>