Personalize o botão Voltar de UINavigationItem na barra de navegação

Recentemente, notei um padrão de desenvolvedores com problemas para personalizar o botão Voltar na barra de navegação. Se você está lendo isso, o problema pode parecer familiar.

Quando você usa um UINavigationController para criar uma pilha de navegação, o iOS cria conveniente e automaticamente um botão Voltar com o título que é o título do controlador de visualização anterior ou a palavra Voltar se o controlador de visualização anterior não tiver título. Claro, muitas vezes você deseja substituir esse título padrão ou talvez até mesmo usar uma imagem em seu lugar. Vamos usar o modelo Master-Detail Application da Apple como exemplo.

Vamos supor que em vez da palavra back ou do título do MasterViewController, você queira usar a palavra Previous. Você olhou a documentação do UINavigationItem e, portanto, no - viewDidLoadmétodo DetailViewController, você cria uma instância de UIBarButtonItem com o título Anterior e, a seguir, define a backBarButtomItempropriedade do UINavigationItem dos controladores da visualização de detalhes para este item de botão de barra que você criou.

- (void)viewDidLoad
{
[super viewDidLoad];
UIBarButtonItem *backButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Previous" style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backButtonItem;
}

Em seguida, você executa o aplicativo e o ¡Viola! … Uma grande decepção, pois nada parecia acontecer. Você verificou duas vezes o seu código, você leu os documentos novamente, você mover as declarações - viewWillAppeare - viewDidLoade ainda nada.

Então, o que a maioria dos desenvolvedores que ficaram presos aqui é criar um item de botão de barra personalizado e definir o botão esquerdo do item de navegação para ele. No entanto, você obtém um botão quadrado em vez do botão com a extremidade triangular. Então, o designer gráfico se envolve e cria uma imagem personalizada que os desenvolvedores usam para criar um UIButton personalizado para usar como uma visualização personalizada para o botão girado à mão para trás. Os desenvolvedores não estão felizes com isso, parece um hack, especialmente considerando que a documentação da Apple diz claramente que você pode personalizar o botão Voltar! WTF ???

Agora eu acho que, considerada como um todo, a documentação da Apple dos frameworks Cocoa e iOS é a melhor de qualquer documentação de framework. Fácil de ler, muito descritivo, fácil de navegar (embora eu me pergunte por que pesquisar a versão da web é tão mais rápido do que a versão local no Xcode). Ocasionalmente, no entanto, a Apple o faz ler nas entrelinhas quando uma ou duas frases adicionais salvariam alguns incidentes desagradáveis ​​de alguns desenvolvedores. A documentação da backButtonItempropriedade é um desses momentos. Vejamos a descrição:

Quando este item de navegação está imediatamente abaixo do item superior na pilha, o controlador de navegação deriva o botão voltar para a barra de navegação deste item de navegação. Quando esta propriedade é nula, o item de navegação usa o valor em sua propriedade title para criar um botão Voltar apropriado. Se desejar especificar uma imagem ou título personalizado para o botão Voltar, você pode atribuir um item de botão de barra personalizado (com seu título ou imagem personalizada) a esta propriedade. Ao configurar o item do botão da barra, não atribua uma visualização personalizada a ele; o item de navegação ignora as visualizações personalizadas no botão da barra traseira de qualquer maneira.

É muito importante ler a primeira frase com atenção, “Quando este item de navegação estiver imediatamente abaixo do item superior da pilha …” O que isso quer dizer, e o que os desenvolvedores às vezes perdem, é que o botão Voltar NÃO está definido no item de navegação do controlador de exibição visível, mas em vez disso, está definido no item de navegação do controlador de exibição anterior. Isso confunde todo mundo porque o resto dos itens na barra de navegação são controlados pelo item de navegação do controlador de visualização visível. Como você pode ver, a documentação diz que o botão Voltar na barra é derivado do item do botão Voltar no item de navegação imediatamente abaixo do item superior da pilha.

Voltando ao aplicativo de exemplo MasterDetail, isso significa que as instruções na instrução pertencem ao método em MasterViewController.- viewDidLoad- viewDidLoad

Além disso, certifique-se de observar que você não pode criar uma visualização personalizada para usar no botão Voltar. As visualizações personalizadas são ignoradas. Você ainda pode definir a imagem de fundo do item do botão da barra traseira com o setBackButtonBackgroundImage:forState:barMetrics:.

Esta dica também foi publicada no meu blog, Objective-Ramblings