Zhe*_*hen 78 objective-c uiviewcontroller uinavigationcontroller ios
我有两个单独的navigationcontrollers
,一个与RootViewController
A,另一个与RootViewController
B.
我能够将ViewController
C 推到A或B的导航堆栈上.
问题:当我在ViewController
C中时,如何知道我是否在属于A或B的堆栈中?
jbu*_*s20 106
你可以使用UINavigationController
的viewControllers
属性:
@property(nonatomic, copy) NSArray *viewControllers
讨论:根视图控制器位于数组中的索引0处,后视图控制器位于索引n-2处,顶部控制器位于索引n-1处,其中n是数组中的项目数.
https://developer.apple.com/documentation/uikit/uinavigationcontroller
您可以使用它来测试根视图控制器(数组索引0处的那个)是视图控制器A还是B.
Geo*_*rge 102
这是接受的答案的实施:
- (UIViewController *)backViewController
{
NSInteger numberOfViewControllers = self.navigationController.viewControllers.count;
if (numberOfViewControllers < 2)
return nil;
else
return [self.navigationController.viewControllers objectAtIndex:numberOfViewControllers - 2];
}
Run Code Online (Sandbox Code Playgroud)
Chr*_*ris 28
- (UIViewController *)backViewController
{
NSInteger myIndex = [self.navigationController.viewControllers indexOfObject:self];
if ( myIndex != 0 && myIndex != NSNotFound ) {
return [self.navigationController.viewControllers objectAtIndex:myIndex-1];
} else {
return nil;
}
}
Run Code Online (Sandbox Code Playgroud)
tjk*_*emz 11
接受答案的更一般的实现:
- (UIViewController *)backViewController {
NSArray * stack = self.navigationController.viewControllers;
for (int i=stack.count-1; i > 0; --i)
if (stack[i] == self)
return stack[i-1];
return nil;
}
Run Code Online (Sandbox Code Playgroud)
无论当前类在导航堆栈中的位置如何,这都将返回正确的"后视图控制器".
extension UIViewController {
func backViewController() -> UIViewController? {
if let stack = self.navigationController?.viewControllers {
for(var i=stack.count-1;i>0;--i) {
if(stack[i] == self) {
return stack[i-1]
}
}
}
return nil
}
}
Run Code Online (Sandbox Code Playgroud)
这是Prabhu Beeman的 Swift代码的修改版本,它适应它以支持Swift 3:
extension UIViewController {
func backViewController() -> UIViewController? {
if let stack = self.navigationController?.viewControllers {
for i in (1..<stack.count).reverse() {
if(stack[i] == self) {
return stack[i-1]
}
}
}
return nil
}
}
Run Code Online (Sandbox Code Playgroud)
作为UINavigationController
扩展:
extension UINavigationController {
func previousViewController() -> UIViewController? {
guard viewControllers.count > 1 else {
return nil
}
return viewControllers[viewControllers.count - 2]
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
92371 次 |
最近记录: |