如何获取视图控制器的名称?
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]);
获取以前的视图控制器
您可以使用UINavigationController
的viewControllers
属性:
@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 中获取当前视图名称(页面名称)