Iphone 如何确定ViewController是否为顶级?

Iphone 如何确定ViewController是否为顶级?,iphone,objective-c,ios,Iphone,Objective C,Ios,我有一个标签栏驱动的应用程序 该应用程序有一些视图控制器,它们以通常的方式堆叠在一起。 其中一些视图控制器可能是顶级的,这意味着直接从选项卡栏控制器实例化。它们的导航栏中没有“后退”按钮 其中一些可以在调用堆栈中的多个点上调用。这意味着它们可以从其他视图控制器调用,而不是直接从选项卡栏调用 我正在寻找一种智能方法,以编程方式确定当前视图控制器当前是否在导航栏中有“后退”按钮。 (如果没有,则我希望在该位置显示其他一些条形图项目。) 如有任何提示,我们将不胜感激。:) 具有topViewContr

我有一个标签栏驱动的应用程序

该应用程序有一些视图控制器,它们以通常的方式堆叠在一起。 其中一些视图控制器可能是顶级的,这意味着直接从选项卡栏控制器实例化。它们的导航栏中没有“后退”按钮

其中一些可以在调用堆栈中的多个点上调用。这意味着它们可以从其他视图控制器调用,而不是直接从选项卡栏调用

我正在寻找一种智能方法,以编程方式确定当前视图控制器当前是否在导航栏中有“后退”按钮。 (如果没有,则我希望在该位置显示其他一些条形图项目。)


如有任何提示,我们将不胜感激。:)

具有topViewController和visibleViewController属性,可以帮助您解决问题。如果您只想知道是否有“后退”按钮,可以检查的backBarButtonItem属性,查看它是否为非零和非隐藏。

考虑只在导航控制器的
视图控制器
数组属性中获取视图控制器的索引。如果为零,则视图控制器是顶部控制器(没有后退按钮)。

好吧。。。从您所描述的内容中,我可以理解,您有一个
UITabBarController
,每个选项卡中都有一个视图控制器列表,每个视图控制器都是一个导航控制器,这将进一步产生新的视图。您感兴趣的是找到一个特定的视图是第一个视图还是第二个视图,依此类推

有趣的是,有一种方法可以做到这一点。导航控制器基本上是一个
viewController
数组,视图添加到导航控制器的索引中。第一个视图将位于索引0中。如果执行
pushViewController
,则
newViewController
将放置在索引1处

只需检查该特定视图的
self.navigationController
的索引计数。如果它大于1,可以确定它不是初始视图


您还可以检查
backBarButtonItem
属性,但也可能不需要该属性。
viewControllers
数组计数应该可以

您可以向视图控制器询问其
-navigationController
,向导航控制器询问其
-viewControllers
堆栈,并查看该堆栈的
-count
是多少


当前显示的视图控制器是堆栈中的“最后”项(索引n-1)。倒数第二个“后退”视图控制器(n-2-n为堆栈计数)。因此,如果堆栈的计数为1,则表示已到达顶部。堆栈中没有可返回的内容,也不会显示“后退”按钮。

尽管比较
topViewController
visibleViewController
时,如果顶部的视图控制器在堆栈中多次出现,则不一定会让您知道是否位于堆栈顶部。您不能添加相同的UIViewController对象多次访问堆栈(如果尝试,将导致崩溃,请参阅)。可以添加同一UIViewController子类的多个实例。因此,如果topViewController==visibleViewController,则visibleViewController位于顶部。是的,如果该堆栈上有两个相同的视图控制器,则它是同一视图控制器类的两个(或moer)实例,但不是同一视图控制器对象。到目前为止,这是清楚的。但是,我的理解是,选项卡栏的视图控制器位于该堆栈的顶部。对吗?--检查与“后退”按钮对应的导航项是否存在听起来很合理。嗨,legolas和jemmons,视图控制器堆栈上的索引计数听起来很合理。我会试试看,自己会找到下一个问题的答案。然而,你可能会知道你的头顶。考虑到顶部有一个UITabBarController,您希望每个选项卡堆栈上每个视图控制器的索引是0还是1?谢谢。tabBarController是
rootViewController
。使用navigationController时,每个视图都会在内部指定给堆栈的每个索引位置。这是navigationController的属性,您可以将其嵌入视图的每个选项卡中。这与
tabBarController
无关。