使用 UIActionSheet 更改视图时工具栏项消失
Posted
技术标签:
【中文标题】使用 UIActionSheet 更改视图时工具栏项消失【英文标题】:Toolbar items dissapear when view changed with UIActionSheet 【发布时间】:2012-10-23 13:32:15 【问题描述】:从UIActionSheet
按钮启动视图时,在通过导航栏后退按钮返回视图时,工具栏虽然仍然可见,但没有之前的任何按钮。此错误自更新到 ios 6 后出现,并在模拟器和仅运行 iOS 6 的设备上测试时发生。如果我注释掉隐藏UIActionSheet
推送的视图上的工具栏的代码,则返回时会添加按钮。
我正在以编程方式在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];
【问题讨论】:
你能在隐藏按钮的地方显示你的代码吗?您是否将它们设置为零? 我不是单独隐藏按钮,而是使用 [self.navigationController setToolBarHiden:YES]; 隐藏整个工具栏;在视图的 viewWillAppear 中。这很奇怪,因为另一个视图是用完全相同的视图显示方法推送的,并且在返回时它可以正常工作。 不确定。我建议发布您的代码。 那么@Jace 这个错误的原因是什么? @Jace 面临同样的问题。有什么合适的解决方案或解释吗? 【参考方案1】:尝试了很多不同的技术,最终通过在一个视图方法中显示它并在下一个视图方法中隐藏它来对其进行排序。这是我遇到的最奇怪的错误之一,这几乎无法解决,但我讨厌有未回答的问题。
【讨论】:
【参考方案2】:您可以通过在下一个视图中隐藏工具栏来解决此问题,但这不是一个很好的解决方案,因为可以从包含工具栏的视图中打开的其他视图都必须在需要时隐藏工具栏,这很烦人。
另一种解决方案是在 viewDidDisappear 中隐藏工具栏,但还有另一个问题,假设另一个新视图也需要工具栏,并且它设置工具栏在自己的 viewWillAppear 中可见,那么问题是新视图的 viewWillAppear实际上会在前一个视图的 viewDidDisappear 之前调用,所以在这种情况下,工具栏会消失,即使新视图也需要它。
无论如何,我不确定这是否是 iOS6 的错误,因为它适用于 iOS5,对我有用的是将打开新视图的代码包装到 dispatch_async(dispatch_queue_t queue, dispatch_block_t block) ,我的理解是,通过这样做,操作表将在显示新视图之前被关闭,因为您将打开新视图的代码放在主队列的末尾(就像我们为 viewDidDisappear 所做的那样,但是这发生在调用下一个视图的 viewWillAppear 之前,所以它工作得很好)。
【讨论】:
【参考方案3】:得到了解决方案,我认为这是 iOS 6.0 及更高版本中的 Apple 错误。
如果有任何视图隐藏工具栏,则在 NavigationController
视图堆栈中,例如self.navigationController.toolbarHidden = YES
,那么由于所有已经创建了带有按钮的工具栏的视图上的那个点,都会松开按钮。
因此,我对这个问题的解决方案是将工具栏保留在所有视图中(不得不在 UI 上妥协,但在我的应用 pikSpeak 中,功能非常重要。)
【讨论】:
【参考方案4】:这是一个古老的线程,我知道,但我最近遇到了这个问题。我的解决方案的线索是在推送新视图和关闭操作表之间需要一些延迟。我从使用 clickedButtonAtIndex 更改为 didDismissWithButtonIndex 以便在操作表消失后进行推送。问题解决了!
【讨论】:
以上是关于使用 UIActionSheet 更改视图时工具栏项消失的主要内容,如果未能解决你的问题,请参考以下文章
如何知道视图层次结构中是不是显示 UIActionSheet?