当UIActionSheet改变视图时,工具栏项目消失

UIActionSheetbutton启动视图时,在通过导航栏后退button返回到视图时,仍然可见的工具栏上没有任何之前的button。 自从升级到iOS 6后,出现此错误,并且仅在运行iOS 6的模拟器和设备上进行testing。 如果我注释掉隐藏在UIActionSheet推送的视图上的工具栏的代码,则在返回时添加button。

我正在viewWillAppear编程我的工具栏项目,并显示我通过self.navigationController.toolbar访问工具栏的UIActionSheet

任何想法是什么导致这个问题? 这只是自iOS 6已经出现,所以有什么变化,我需要考虑到viewWillAppear

这是如何从actionSheet推送视图:

 - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { if (actionSheet.tag == 2) { if (buttonIndex == 0) { [self dismissAllTips]; self.actionNoteAddView= [[self.storyboard instantiateViewControllerWithIdentifier:@"IDActionNoteAddView"] retain]; actionNoteAddView.note_id = 0; actionNoteAddView.iscompleted=0; [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"tool_tips"]; [self.navigationController pushViewController:actionNoteAddView animated:TRUE]; [actionNoteAddView release]; }else if(buttonIndex == 1){ ... 

这些是推送视图的视图方法:

 -(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; self.navigationItem.hidesBackButton = NO; [self.navigationController setToolbarHidden:YES]; txtcontent.layer.cornerRadius = 10.0f; } -(void)viewDidAppear:(BOOL)animated{ [super viewDidAppear:animated]; } 

以下是使用actionSheet推送视图的视图的视图方法:

 - (void) viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; self.navigationItem.hidesBackButton = YES; [self.navigationController setToolbarHidden:NO]; self.navigationController.navigationBarHidden=NO; self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque; self.navigationController.navigationBar.tintColor = [UIColor colorWithRed:0.8 green:0.45 blue:0.2 alpha:1]; self.navigationController.toolbar.barStyle = UIBarStyleBlackOpaque; self.navigationController.toolbar.tintColor = [UIColor colorWithRed:0.8 green:0.45 blue:0.2 alpha:1]; UIImage *actionButtonImage = [UIImage imageNamed:@"31-circle-plus@2x.png"]; UIBarButtonItem *actionButton = [[UIBarButtonItem alloc] initWithImage:actionButtonImage style:UIBarButtonItemStylePlain target:self action:@selector(actionPressed:) ]; UIImage *dashButtonImage = [UIImage imageNamed:@"19-gear.png"]; UIBarButtonItem *dashButton = [[UIBarButtonItem alloc] initWithImage:dashButtonImage style:UIBarButtonItemStylePlain target:self action:@selector(settingsPressed:)]; UIBarButtonItem *flexItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; NSArray *toolitems = [NSArray arrayWithObjects:dashButton, flexItem, actionButton, flexItem, nil]; [self setToolbarItems:toolitems]; self.title = @"Dashboard"; defaultProfile.text = [[NSUserDefaults standardUserDefaults] stringForKey:@"default_profile"]; BOOL dailyProcess = [[NSUserDefaults standardUserDefaults] boolForKey:@"daily_process"]; if(dailyProcess){ [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"daily_process"]; [[NSUserDefaults standardUserDefaults] synchronize]; loading = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; labelProcess = [[UILabel alloc]initWithFrame:CGRectMake(60, 105, 240, 30)]; labelProcess.text = @"Processing..."; labelProcess.backgroundColor = [UIColor clearColor]; labelProcess.textColor=[UIColor colorWithRed:0.8 green:0.45 blue:0.2 alpha:1]; [labelProcess setFont:[UIFont systemFontOfSize:20]]; loading.opaque = NO; loading.backgroundColor = [UIColor colorWithWhite:0.0f alpha:0.6f]; indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; [indicator setHidesWhenStopped:YES]; indicator.center = self.view.center; [self.view addSubview:loading]; [self.view addSubview:indicator]; [self.view addSubview:labelProcess]; [indicator startAnimating]; } } -(void)viewDidAppear:(BOOL)animated{ [super viewDidAppear:animated]; CGRect frame = CGRectMake(157, 365, 10, 10); UIView *viewToPointAt = [[UIView alloc] initWithFrame:frame]; [self.view addSubview:viewToPointAt]; BOOL willies = [[NSUserDefaults standardUserDefaults] boolForKey:@"tool_tips"]; if(willies==YES){ if(popTip == nil) { popTip = [[[CMPopTipView alloc] initWithMessage:@"Step 1/3: This is the Action Button. You can create, view and auto-fill notes which are then added to your timeline.(Click for step 2)."] autorelease]; popTip.delegate = self; [popTip presentPointingAtView:viewToPointAt inView:self.view animated:YES]; popTip.backgroundColor = [UIColor colorWithRed:0.8 green:0.45 blue:0.2 alpha:1]; popTip.textColor = [UIColor whiteColor]; } } [viewToPointAt release]; } 

尝试了很多不同的技术,最终通过在一个视图方法中显示并将其隐藏在下一个方法中对其进行sorting。 这是我遇到的最奇怪的错误之一,这不是一个修复,但我讨厌有没有答案的问题。

您可以通过在下一个视图中隐藏工具栏来解决这个问题,但这不是一个很好的解决scheme,因为从包含工具栏的视图中可能打开的其他视图都必须在需要时隐藏工具栏,这很烦人。

另一个解决scheme是隐藏工具栏在viewDidDisappear,但还有另一个问题,让我们说另一个新的视图需要工具栏以及它设置工具栏在自己的viewWillAppear可见,然后问题是viewWillAppear新视图将被称为实际上在viewDidDisappear之前的视图之前,所以在这种情况下,即使新的视图需要它的工具栏消失。

无论如何,我不知道如果这是iOS6的错误,因为它适用于iOS5,对我来说,工作是打开新视图的代码包装到dispatch_async(dispatch_queue_t队列,dispatch_block_t块) ,我的理解是通过这样做时,在新视图显示之前,操作表将被解除,因为您将打开新视图的代码放到主队列的末尾(就像我们为viewDidDisappear所做的一样,但是这发生在调用viewWillAppear下一个视图之前所以它工作完美)。

得到的解决scheme,我认为这是iOS 6.0及以上的苹果的错误。

NavigationController视图堆栈中,如果任何视图隐藏了工具栏,例如self.navigationController.toolbarHidden = YES ,那么从所有已经创build了带button的工具栏的所有视图上的点,将松开button。

所以,我解决这个问题的方法是将toolBar放在所有视图中(必须在UI上妥协,但在我的应用程序pikSpeak中,function非常重要)。

我知道这是一条古老的线索,但最近我遇到了这个问题。 我的解决scheme的线索是推迟新视图和closures操作表之间需要一些延迟。 我改变了使用clickedButtonAtIndex didDismissWithButtonIndex,以便推动将发生在行动表消失后。 问题解决了!