3

UIActionSheet按钮启动视图时,在通过导航栏后退按钮返回视图时,工具栏虽然仍然可见,但没有以前在其上的任何按钮。此错误自更新到 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

4 回答 4

1

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

于 2012-10-29T16:37:45.527 回答
0

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

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

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

于 2013-03-29T02:26:16.547 回答
0

得到了解决方案,我认为这是 iOS 6.0 及更高版本中的 Apple 错误。

NavigationController视图堆栈中,如果任何视图隐藏了工具栏,例如self.navigationController.toolbarHidden = YES,那么由于所有已经创建了带有按钮的工具栏的视图上的那个点,都会松开按钮。

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

于 2013-04-16T08:02:37.833 回答
0

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

于 2014-08-15T02:48:53.117 回答