UINavigationController popToRootViewController не сбрасывает заголовок, очищает кнопку - PullRequest
0 голосов
/ 12 мая 2011

Я застрял, пытаясь настроить кнопку UINavigationController. В RootViewController я установил self.title в viewDidLoad, и эта строка появляется в панели навигации. В -didSelectRowAtIndexPath я создаю дочерний контроллер вида, настраиваю кнопку возврата и вызываю -pushViewController. Обработка для дочерних элементов поместит дочерние view-контроллеры в стек; Мне нужна кнопка назад, чтобы перейти к начальному виду, так же, как при возврате из первого дочернего контроллера вида. На текущей кнопке появится всплывающее окно с предыдущим представлением, поэтому, если в стеке находятся 5 контроллеров дочерних представлений, мне придется нажать кнопку «Назад» 5 раз, чтобы перейти к корневому представлению. Я не могу заставить действие отключиться, когда отображается кнопка «Назад». Я могу popToRootViewController, когда в детском ВК; однако кнопка теперь отображается в корневом представлении (!), и мне приходится нажимать кнопку еще раз, чтобы восстановить исходный заголовок и удалить кнопку. Вот часть root -viewDidLoad:

- (void)viewDidLoad {
    self.title = @"My Nav Bar Title";     // displays on root navigation bar title
    // some setup code...
    [super viewDidLoad];
}

Вот часть -didSelectRowAtIndexPath, где при выборе ячейки табличного представления дочернее представление помещается в стек:

- (void)tableView:(UITableView *)tableView 
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
   ChildVC *child = [[ChildVC alloc]
                             initWithNibName:@"Child"
                             bundle:nil];

    [self.navigationController dismissModalViewControllerAnimated:YES]; 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 

    UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Quiz" style:UIBarButtonItemStylePlain target:self action:@selector(backToMenu)];
    self.navigationItem.backBarButtonItem = backButton;
    [backButton release];

    [self.navigationController pushViewController:child
                                          animated:YES];
     [child release];
}

Вот метод действия, который не срабатывает при нажатии кнопки:

-(void)backToMenu {
    NSLog(@" in root backToMenu");
    [self.navigationController popViewControllerAnimated:YES];
}

ChildVC также создаст нового дочернего элемента в -didSelectRowAtIndexPath и выдвинет новый дочерний контроллер в качестве следующей дочерней «страницы»:

- (void)tableView:(UITableView *)tableView 
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    Child *newChild = [[Child alloc]
                             initWithNibName:@"Child"
                             bundle:nil];

    [self.navigationController dismissModalViewControllerAnimated:YES]; 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    self.title = self.quizString;  // child view correctly displays customized title

    UIBarButtonItem *backButton = [[UIBarButtonItem alloc] 
                                   initWithTitle:@"Quiz" 
                                   style:UIBarButtonItemStylePlain 
                                   target:self 
                                   action:@selector(backToMenu)];
    self.navigationItem.backBarButtonItem = backButton;
    [backButton release];

    [self.navigationController pushViewController:newQuestion
                                         animated:YES];
    [newChild release];
}

В Child -viewWillDisappear Я установил глобальную переменную, чтобы я знал, когда нужно выдвинуть нового потомка, а когда вернуться к корню:

-(void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:YES];
    if (startOver) {
          [self backToMenu];
    }
}

Child -backToMenu:
-(void)backToMenu {
    [self.navigationController popToRootViewControllerAnimated:YES];
}

Ниже приведена последовательность действий при нажатии кнопки «Назад» в дочернем режиме:

- Child -viewWillDisappear вызывается, вызывает -backToMenu - -backToMenu вызывает popToRootViewControllerAnimated: - Child -viewWillDisappear вызывается снова, вызывает -backToMenu - root -viewWillAppear вызывается - управление возвращается в Child -backToMenu

Корневой вид отображается правильно, но панель навигации содержит кнопку «Назад» и заголовок, как будто это был дочерний вид. Нажатие кнопки «Назад» удаляет кнопку «Назад» и восстанавливает первоначальный заголовок.

Как я могу заставить эту работу? В идеале я хотел бы иметь только 1 дочернее представление в стеке, но я не могу понять, как; тогда кнопка «Назад» вернется к корневому виду. Но когда я попробовал это, я получил NSInvalidArgumentException ', причина: «Нажатие на один и тот же экземпляр контроллера представления более одного раза не поддерживается ...» *

Кроме того, есть ли что-то очевидное, почему действие не запускается при нажатии кнопки? Любая помощь очень ценится ... THX

Ответы [ 2 ]

0 голосов
/ 15 марта 2013
UIBarButtonItem *btnBack=[[UIBarButtonItem alloc]initWithTitle:@"" style:UIBarButtonItemStyleDone target:self action:@selector(back:)] ;
    self.navigationItem.leftBarButtonItem=btnBack;
    //Add image on back button
    UIImage *backButtonImage = [[UIImage imageNamed:@"btn_back.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 13, 0, 6)];
    [btnBack setBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

поместите этот код в форму контроллера [initWithNibName method], где вы хотите pop в контроллер корневого представления

- (void) back : (id)sender
{

 [self.navigationController popToRootViewControllerAnimated:YES];

}
0 голосов
/ 28 июля 2011

хм, ваш backButton вызывает popToRootViewController, что вызывает viewWillDissapear, что, если startOver имеет значение true, вызывает popToRootViewController СНОВА?что произойдет, если это все равно ложь?он продолжает popToRootViewController, вызываемый ранее ...

backButton->popToRoot->viewWillDissapear->check startOver
->YES->popToRoot->viewWillDissapear again->check startOver again->??
->NO->continue the disappearing of the view that was called also by popToRoot

, разве это не избыточно, поскольку обе его ветви продолжают ранее popToRoot или снова вызывают popToRoot?

почему бы не проверить сначала startOver (в вашем backToMenu), а затем popToRootViewController, если true?

...