调用tabbarcontroller的navigationController的标题

时间:2014-05-22 11:53:39

标签: ios xcode navigationcontroller

我的应用程序故事板如下

storyboadrd

它是一个基于标签栏控制器的应用程序,其中一个选项卡嵌入在导航控制器中。当用户单击第一个选项卡(view1)并单击此视图内的按钮时,他将被移动到view2。而不是使用后退按钮返回到view1,我希望用户单击选项卡项以返回到view1工作正常。但是,我想在用户单击选项卡时查看警报,并且他在View2中。我正在使用 shouldSelectViewController didSelectViewController 委托方法来检查单击的选项卡并查看警报。问题是我无法通过委托中的这些方法访问View2,以通知应用程序仅在用户处于view2并单击选项卡时才能查看警报。

我尝试在shouldSelectViewController

中使用此代码
    if (tabBarController.selectedIndex == 0) {
    NSLog(@"Delegate nav title: %@", tabBarController.selectedViewController.navigationItem.title);
}

这些行总是返回view1的标题

2 个答案:

答案 0 :(得分:1)

由于它们位于同一导航控制器中,因此它们具有相同的导航项。每个视图都可以配置此导航项,但它通常是同一个对象。这就是为什么它返回相同的标题。尝试在第二个视图控制器的viewDidLoad方法中设置导航项标题。

答案 1 :(得分:0)

我终于找到了解决问题的解决方案 首先,我向View2添加了一个静态变量,并在View2中调用它,如下所示 在View2.h中

@interface
{}

+ ( BOOL ) isInQuizViewController;
+ ( void )setInQuizViewController:(BOOL)inQuizVal;
//...
@end
View2.m中的

@implementation
   static BOOL inView2 = NO;

+(BOOL)isInView2
{
    return inView2;
}
+ ( void )setInView2:(BOOL)Val
{
    inView2 = val;
}

这两种方法用于设置和获取inView2的值,告诉我用户当前是否在View2中

View1.h中的

创建一个与从View1传输到View2并将其连接到故事板的按钮相关联的IBAction

- (IBAction)GoToView2:(id)sender;

转到View1.m并导入

#import "View2.h"

并实现您的IBAction方法以将InView2设置为YES

- (IBAction)GoToView2:(id)sender {
[View2 setInView2:YES];
}

然后在delegate.m

#import "View2.h"
@implementation AppDelegate

UITabBarController * _tabBarController;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    _tabBarController = (UITabBarController *)_window.rootViewController;
    _tabBarController.delegate = self;

    // Override point for customization after application launch.
    return YES;
}

我定义了一个全局_tabBarController并将其设置为_window.rootViewController并将其委托设置为此委托并记住导入“View2.h”

转到ShouldSelectViewController方法(请注意,此方法在转换到所选选项卡ViewController之前称为,因此它非常适合决定是否应将所选选项卡viewController显示为用户)。 所以在ShouldSelectViewController方法中我做了以下

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController {



    if(tabBarController.selectedIndex == 2)
    {
        if ([View2 isInView2]) {


        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"alert"
                                                            message:@"are you sure you want to exit?"
                                                           delegate:self
                                                  cancelButtonTitle:@"Cancel"
                                                  otherButtonTitles:@"Yes",nil];
        [alertView show];

        return NO;
        }
    }
    return YES;

}


-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{

    if(buttonIndex == 1)
    {//ok button pressed




//        NSInteger destinationTabIdx = 2;
//        UIView * fromView = tabBarController.selectedViewController.view;
//        UIView * toView = [[[[[tabBarController.viewControllers objectAtIndex:destinationTabIdx] navigationController] viewControllers] objectAtIndex:0] view];

        UINavigationController *nav = (UINavigationController *)_tabBarController.selectedViewController;

        NSLog(@"vc title: %@",nav.title);
//        [UIView transitionFromView:fromView toView:toView duration:0.8
//                           options: UIViewAnimationOptionTransitionNone
//                        completion:^(BOOL finished) {
//                            if (finished) {
//                                tabBarController.selectedIndex = destinationTabIdx;
//                            }
//                        }];
        [nav popViewControllerAnimated:YES];
        [QuizViewController setInQuizViewController:NO];
        NSLog(@"app delegate transistion done");


    }

}