Элементы панели инструментов исчезают при изменении вида с помощью UIActionSheet


При запуске представления с помощью кнопки UIActionSheet, при возвращении в представление с помощью кнопки назад панели навигации, панель инструментов, пока еще видна, не имеет ни одной из кнопок, которые были на ней ранее. Эта ошибка возникла с момента обновления до iOS 6 и возникает при тестировании его на симуляторе и устройстве, работающем только на iOS 6. Если я закомментирую код, который скрывает панель инструментов в представлении, нажатом UIActionSheet, кнопки добавляются при возврате.

Я делаю свои элементы панели инструментов программно в viewWillAppear и показывая UIActionSheet из панели инструментов, к которой я обращаюсь через self.navigationController.toolbar.

Есть идеи, что вызывает эту проблему? Это произошло только с тех пор, как появилась iOS 6, так есть ли какие-либо изменения, которые мне нужно принять во внимание относительно viewWillAppear?

Вот как вид выталкивается из таблицы действий:

- (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];

}

Это методы представления для представления, которое толкнуло представление с помощью лист действий:

- (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 3

4 ответа:

Перепробовал множество различных методов и в конечном итоге отсортировал его, показав его в одном методе просмотра и спрятав его в следующем. Это одна из самых странных ошибок, с которыми я сталкивался, и это вряд ли исправление, но я ненавижу, когда вопросы остаются без ответа.

Вы можете решить эту проблему, спрятав панель инструментов в следующем представлении, но это не очень хорошее решение, так как другие представления, которые могут быть открыты из представления, содержащего панель инструментов, будут вынуждены скрывать панель инструментов, когда это необходимо, это раздражает.

Другое решение состоит в том, чтобы скрыть панель инструментов в viewDidDisappear, но есть и другая проблема, скажем, другой новый вид также нуждается в панели инструментов, и он устанавливает панель инструментов видимой в своем собственном viewWillAppear, то проблема в том, что viewWillAppear для нового вида будет вызван фактически до viewDidDisappear предыдущего вида, так что в этом случае панель инструментов исчезнет, даже если новый вид пожелает этого.

В любом случае, я не уверен, что это ошибка iOS6, так как она отлично работает для iOS5, что сработало для меня, чтобы обернуть код, который открывает новое представление в dispatch_async(dispatch_queue_t queue, dispatch_block_t block), мое понимание заключается в том, что при этом лист действий будет отклонен до того, как новое представление будет создано. показано, как вы помещаете код, который открывает новое представление в конец основной очереди (как то, что мы сделали для viewDidDisappear, но это происходит до вызова viewWillAppear следующего представления, поэтому он работает идеально).

Получил решение, и я думаю, что это ошибка Apple в iOS 6.0 и выше.

В стеке представлений NavigationController если какое-либо представление скрывает панель инструментов, например self.navigationController.toolbarHidden = YES, то с этого момента на всех представлениях, которые уже создали панель инструментов с кнопками, кнопки будут потеряны.

Таким образом, мое решение этой проблемы состояло в том, чтобы сохранить панель инструментов во всех представлениях(пришлось пойти на компромисс с пользовательским интерфейсом, но в моем приложении pikSpeak функциональность была очень важна.)

Это древняя нить, я знаю, но я только недавно столкнулся с этой проблемой. Ключ к моему решению состоял в том, что требовалась некоторая задержка между запуском нового вида и закрытием листа действий. Я перешел с использования clickedButtonAtIndex на didDismissWithButtonIndex, так что толчок произойдет после того, как лист действий исчезнет. Проблема решена!