Todas as respostas configuradas UINavigationBar.appearance().tintColorentram em conflito com a documentação da Apple em UIAppearance.h.
Nota para iOS7: no iOS7, a tintColorpropriedade foi movida para UIViewe agora possui um comportamento herdado especial descrito em UIView.h. Esse comportamento herdado pode entrar em conflito com o proxy de aparência e, portanto, tintColoragora não é permitido com o proxy de aparência.
No Xcode, você precisa clicar com o botão direito do mouse em cada propriedade que deseja usar com o proxy de aparência para inspecionar o arquivo de cabeçalho e garantir que a propriedade esteja anotada UI_APPEARANCE_SELECTOR.
Portanto, a maneira correta de colorir a barra de navegação de roxo e o título e os botões brancos em todo o aplicativo por meio do proxy de aparência é:
UINavigationBar.appearance().isTranslucent = false
UINavigationBar.appearance().barTintColor = .purple
UINavigationBar.appearance().titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
UIBarButtonItem.appearance().tintColor = .white
Observe que UIBarButtonItemnão é uma subclasse de UIViewmas sim NSObject. Portanto, sua tintColorpropriedade não é a herdada tintColorde UIView.
Infelizmente, UIBarButtonItem.tintColornão é anotado com UI_APPEARANCE_SELECTOR- mas isso me parece um bug de documentação. A resposta da Apple Engineering neste radar afirma que é suportada.