如何获取视图控制器的名称?

Posted

技术标签:

【中文标题】如何获取视图控制器的名称?【英文标题】:How to get the name of the view controller? 【发布时间】:2016-03-02 08:53:56 【问题描述】:

我正在使用以下代码来获取到目前为止导航的视图控制器的名称,

NSMutableArray *navigationArray = [[NSMutableArray alloc] initWithArray: self.navigationController.viewControllers];
NSLog(@"%@",navigationArray);

但是我在情节提要中使用了这种方法,这不起作用,任何人都可以帮助解决这个问题

【问题讨论】:

你试图获取当前视图控制器名称 这不是视图控制器的名称,而是视图控制器实例的数组。 是的,如何在情节提要中使用此代码,我可以使用@***Foe 你的意思是视图控制器的title 您要问的是哪个 name?故事板ID?班级名称? xib 名称(如果不同)? 【参考方案1】:

使用NSStringFromClass()。它以string 的形式返回一个类的名称。

如果你想获取一些视图控制器名称,请喜欢

   NSString *viewName = NSStringFromClass([yourviewControllerName class]);

如果你想获取当前视图控制器,请喜欢

NSString *viewName = NSStringFromClass([self class]);

获取以前的视图控制器

您可以使用UINavigationControllerviewControllers 属性:

@property(nonatomic, copy) NSArray *viewControllers

NSArray * allViewController = self.navigationController.viewControllers;

另一种选择

获取导航使用中可用的视图控制器的数量,例如

NSInteger totalCount = self.navigationController.viewControllers.count;

更新

UIViewController *allViewController = self.navigationController.viewControllers[totalCount - 2];
Class previousVCClass = [allViewController class];
NSString *className = NSStringFromClass(previousVCClass);

【讨论】:

我需要获取我浏览过的所有视图控制器的名称。, 它返回 NULL,我在情节提要的 xib bur 中发布的代码我无法得到结果。 @Arun -- presentViewController 没有嵌入Navigation controller,如果需要,我们需要手动实现导航控制器,这就是你没有得到全部的原因查看控制器名称 你必须做[self.navigationController pushViewController:vc animated:YES]。你的命名约定也很麻烦。 简单,把[self presentViewController:vc animated:YES completion:nil];改成[self.navigationController pushViewController:vc animated:YES];就行了【参考方案2】:

您将不得不迭代导航堆栈并使用 Anbu 的解决方案来检索他们的类名:

NSMutableArray* viewControllersNames = [[NSMutableArray alloc] init];
for(UIViewController *vc in self.navigationController.viewControllers)

    NSString *vcName = NSStringFromClass([vc class]);
    [viewControllersNames addObject:vcName];


self.navigationController.viewControllers 属性中,存储了所有尚未弹出的视图控制器。在这里,我们遍历它们并将它们的类名添加到一个数组中。您的第一个ViewController 将位于数组的0 索引处,而您的最后一个(当前呈现的视图控制器)将位于count-1 索引处。

仅当您通过导航控制器呈现视图控制器时,此解决方案才有效。如果您使用的是模态演示,它将无法正常工作。由于您的帖子给人的印象是您正在使用导航控制器,并且您说您正在这样做,因此解决方案也适用于导航控制器方法。

【讨论】:

最短且正确的答案。我支持。 @Arun,使用它。如果您想要视图控制器的标题,正如您的问题下 cmets 中提到的@Andrey Gordeev,那么代码将类似于NSString *vcTitle = vc.title; [viewControllerNames addObject:vcTitle]; 【参考方案3】:

这可能会帮助您解决问题 在 Storyboard 上选择每个视图控制器并转到类检查器。然后为每个视图控制器设置唯一的故事板标识符。您可以访问任何视图控制器的实例。

id controller =  [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"ControllerIdentifier"];

另一种方式

  NSMutableArray *navigationArray = [[NSMutableArray alloc] initWithArray: self.navigationController.viewControllers];
  id  controller1 = [navigationArray objectAtIndex: 0];
  id  controller1 = [navigationArray objectAtIndex: 1];
  ....

【讨论】:

如果只有一个 ViewController 数组和索引超出范围,这段代码将会崩溃。另外,访问 VC 不是他的问题。 嘿@NSNoob 我刚刚提出了可能的方法。您可以根据自己的要求构建逻辑。

以上是关于如何获取视图控制器的名称?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取情节提要的字符串名称?

如何在 laravel 5.7 中获取当前视图名称(页面名称)

如何从子动作内部获取当前控制器和动作?

Django 2.2.3 如何获取所有 urls 模式和所有视图名称

MVC如何从视图调用控制器中的动作以返回值

如何获取根视图控制器?