我的应用程序故事板如下
它是一个基于标签栏控制器的应用程序,其中一个选项卡嵌入在导航控制器中。当用户单击第一个选项卡(view1)并单击此视图内的按钮时,他将被移动到view2。而不是使用后退按钮返回到view1,我希望用户单击选项卡项以返回到view1工作正常。但是,我想在用户单击选项卡时查看警报,并且他在View2中。我正在使用 shouldSelectViewController 和 didSelectViewController 委托方法来检查单击的选项卡并查看警报。问题是我无法通过委托中的这些方法访问View2,以通知应用程序仅在用户处于view2并单击选项卡时才能查看警报。
我尝试在shouldSelectViewController
中使用此代码 if (tabBarController.selectedIndex == 0) {
NSLog(@"Delegate nav title: %@", tabBarController.selectedViewController.navigationItem.title);
}
这些行总是返回view1的标题
答案 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");
}
}