使用UIActionSheet更改视图时,工具栏项目消失

时间:2012-10-23 13:32:15

标签: ios ios6 uitoolbar uiactionsheet viewwillappear

UIActionSheet按钮启动视图时,通过navigationBar后退按钮返回视图时,工具栏仍然可见,但没有任何先前在其上的按钮。自从更新到iOS 6后出现此错误,并且仅在模拟器和运行iOS 6的设备上进行测试时发生。如果我注释掉隐藏UIActionSheet推送的视图上工具栏的代码,则返回时会添加按钮。

我正在viewWillAppear以编程方式制作我的工具栏项目,并显示工具栏中的UIActionSheet,我正通过self.navigationController.toolbar访问。

知道造成这个问题的原因是什么吗?这是因为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];

}

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

另一个解决方案是隐藏viewDidDisappear中的工具栏但是还有另一个问题,假设另一个新视图也需要工具栏,并且它将工具栏设置为在其自己的viewWillAppear中可见,那么问题是新视图的viewWillAppear将在上一个视图的viewDidDisappear之前实际调用,因此在这种情况下,即使新视图需要,工具栏也会消失。

无论如何,我不确定这是否是iOS6的错误,因为它适用于iOS5,对我来说有用的是将打开新视图的代码包装成 dispatch_async(dispatch_queue_t queue,dispatch_block_t block) ,我的理解是,通过执行此操作,在显示新视图之前将关闭操作表,因为您将打开新视图的代码放到主队列的末尾(就像我们为viewDidDisappear所做的那样,但是这发生在调用下一个视图的viewWillAppear之前,所以它工作得很完美。)

答案 2 :(得分:0)

获得了解决方案,我认为它是iOS 6.0及更高版本中的Apple漏洞。

NavigationController视图堆栈中,如果任何视图隐藏工具栏,例如self.navigationController.toolbarHidden = YES,然后从那个已经创建了带按钮的工具栏的所有视图开始,将松开按钮。

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

答案 3 :(得分:0)

这是一个古老的话题,我知道,但我最近遇到了这个问题。我的解决方案的线索是,在推送新视图和关闭操作表之间需要一些延迟。我使用clickedButtonAtIndex更改为didDismissWithButtonIndex,以便在操作表消失后进行推送。问题解决了!