2013-10-15 79 views
2
-(UINavigationController *) navigationControllerOfParentOrSelf //These 2 functions are short so I just go ahead 
{ 
    UIViewController * current=self; 
    while (current) { 
     UINavigationController * nav = current.navigationController; 
     if (nav) { 
      return nav; 
     } 
     current=current.parentViewController; 
    } 
    return nil; 
} 

-(UITabBarController *) tabBarControllerOfParentOrSelf 
{ 
    UIViewController * current=self; 
    while (current) { 
     UITabBarController * tc = current.tabBarController; 
     if (tc) { 
      return tc; 
     } 
     current=current.parentViewController; 
    } 
    return nil; 
} 

看起来像很多重复的代码。如何让这个UINavigationController寻求更优雅的代码?

基本上我只想知道一个UIViewController是否在UINavigationController中。事情是navigationController属性通常为零时的UIViewController是childViewController

+0

你的循环是没有意义的。如果'navigationController'属性不为零,它将执行一次。如果它是零,它将永远运行。 –

+0

固定。好的,那不是问题。 –

回答

2

我建议是这样的:

-(UINavigationController *) navigationControllerOfParentOrSelf 
{ 
    return [self parrentControllerOfParrentOrSelfWithGetter: @selector(navigationController)]; 
} 

-(UITabBarController *) tabBarControllerOfParentOrSelf 
{ 
    return [self parrentControllerOfParrentOrSelfWithGetter: @selector(tabBarController)]; 

} 

- (id) parrentControllerOfParrentOrSelfWithGetter: (SEL) getter 
{ 
    UIViewController * current=self; 
    while (current) { 
     id res = [current performSelector: getter]; 
     if (res) { 
      return tc; 
     } 
     current=current.parentViewController; 
    } 
    return nil; 
} 
+0

好的答案,比我好:) –

1

你可以不喜欢它:

-(id) getViewController:(BOOL)isNavController 
{ 
    id controller = nil; 
    if(isNavController) 
    { 
     controller = self.navigationController; 
    } 
    else 
    { 
     controller = self.tabBarController; 
    } 

    return controller; 
} 
+0

这是一个改进。关键是我们使用了一个bool变量。如果我们希望增加更多的财产,那么呢?我正在思考沿着performSelector(@ navigatorController) –