Como definir o texto do botão Voltar no Swift

207

Como você remove o texto do botão Voltar.

Botão de retorno atual:

<Voltar

Botão voltar desejado:

<AnythingElse

Nenhuma delas funcionou:

self.navigationItem.backBarButtonItem?.title = "Back"
self.backItem?.title = ""
self.navigationController?.navigationBar.backItem?.title = ""
self.navigationItem.backBarButtonItem?.title = ""
self.navigationController?.navigationItem.backBarButtonItem?.title="Back"
self.navigationController?.navigationBar.backItem?.title = ""
self.navigationController?.navigationItem.backBarButtonItem?.title
Onichan
fonte

Respostas:

604

O botão Voltar pertence ao controlador de exibição anterior , não ao apresentado atualmente na tela.
Para modificar o botão Voltar, você deve atualizá-lo antes de pressionar, no controlador de exibição que iniciou o seguinte:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    let backItem = UIBarButtonItem()
    backItem.title = "Something Else"
    navigationItem.backBarButtonItem = backItem // This will show in the next view controller being pushed
}

Swift 3, 4 e 5:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let backItem = UIBarButtonItem()
    backItem.title = "Something Else"
    navigationItem.backBarButtonItem = backItem // This will show in the next view controller being pushed
}

OU

// in your viewDidLoad or viewWillAppear
navigationItem.backBarButtonItem = UIBarButtonItem(
    title: "Something Else", style: .plain, target: nil, action: nil)
Yariv Nissim
fonte
9
Muito obrigado, você não sabe quantas horas eu gasto apenas para esse pequeno detalhe (o controlador anterior)
Ricardo
3
Se eu pudesse votar um milhão de vezes, faria. Não posso te dizer quanto tempo eu passei perguntando por que ele não estava funcionando (foi anteriormente no controlador de destino)
Dylan Ireland
13
"O botão voltar pertence ao controlador de exibição anterior", que é a resposta mais valiosa que eu encontrei sobre esse tópico! Obrigado!
Vhristoskov #
1
Definir as titlealterações no título , não apenas no botão Voltar.
Yariv Nissim
4
Eu adicionei self.navigationController .navigationBar.topItem .backBarButtonItem = backItem vez de navigationItem.backBarButtonItem = backItem e ele funciona muito bem em Swift 3. Obrigado!
Indra Adam
125

Você pode fazer isso no construtor de interface da seguinte maneira:

clique no item de navegação do controlador de exibição anterior

insira a descrição da imagem aqui

no inspetor de atributos, defina o texto do botão Voltar para o que quiser. É isso aí!!

insira a descrição da imagem aqui

Ajinkya Patil
fonte
1
qual é a melhor maneira de atribuir 'zero'?
Kennydust
@kennydust Você quer dizer título em branco?
Ajinkya Patil
8
@kennydust sim no espaço add botão voltar e pressione enter
Ajinkya Patil
Fácil e agradável, mas é localizável?
Gruntcakes
2
@AjinkyaPatil Eu tentei isso, mas o botão Voltar não aparece. Alguma razão para que isso possa ser?
precisa saber é o seguinte
48

O texto do botão Voltar é obtido do título do item de navegação do controlador de exibição pai. Portanto, o que você definir no título do item de navegação do controlador de exibição anterior será mostrado no texto do botão de volta do controlador de exibição atual. Você pode apenas "" colocar o título do item de navegação no método viewWillAppear do controlador-pai.

self.navigationItem.title = ""

Outra maneira é colocar

self.navigationController?.navigationBar.topItem?.title = ""

no método viewWillAppear do controlador de exibição atual. Este causará algum outro problema se a pilha de navegação estiver muito aninhada.

minhazur
fonte
5
self.navigationItem.title = "" deve estar no topo como a melhor resposta!
rilar
Eu concordo com isso, pois a melhor resposta faz com que todas as respostas acima exijam a adição de uma função de destino ao item de navegação; portanto, elas não mudam apenas o texto, mas também adicionam uma função pop personalizada, o que não é exigido pela pergunta!
IsPha
Isso funciona bem prepareForSegue, o que é. um pouco mais limpo, porque você não está alterando o novo viewController após o carregamento.
Adrian
Preste atenção!!! coloque self.title = "....." antes da chamada para self.navigationItem.title = ""
Bary Levy
45

Você pode colocar essas 3 linhas de código noViewController botão que deseja alterar o título do botão Voltar.

No seu override func viewDidLoad() {}.

let backButton = UIBarButtonItem()
backButton.title = "My Back Button Title"
self.navigationController?.navigationBar.topItem?.backBarButtonItem = backButton
Hitesh Chauhan
fonte
2
Essa solução parece mais correta, pois você coloca a lógica no VC que chega e não no VC que está saindo. Aka: lê melhor.
eonist
37

Se você estiver usando o arquivo xib para o view controller, faça isso na sua classe do view controller.

class AboutUsViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    edgesForExtendedLayout = []
    setUpNavBar()
}

func setUpNavBar(){
    //For title in navigation bar
    self.navigationController?.view.backgroundColor = UIColor.white
    self.navigationController?.view.tintColor = UIColor.orange
    self.navigationItem.title = "About Us"

    //For back button in navigation bar
    let backButton = UIBarButtonItem()
    backButton.title = "Back"
    self.navigationController?.navigationBar.topItem?.backBarButtonItem = backButton
}

}

O resultado será:

insira a descrição da imagem aqui

mustaq
fonte
29

Eu não sei onde você usou seus métodos que você colocou na sua pergunta, mas eu poderia obter o resultado desejado se eu usasse, na minha ViewControllerclasse (na qual desejo alterar o botão voltar), na viewDidLoad()função, a seguinte linha:

self.navigationController?.navigationBar.backItem?.title = "Anything Else"

O resultado será:

Antes

insira a descrição da imagem aqui

Depois de

insira a descrição da imagem aqui

Francisco Romero
fonte
3
No meu caso, só funcionava se você colocar este pedaço de código no método viewDidAppear e não a viewDidLoad um
apinho
2
Use navigationController.navigationBar.topItem?.title = ""em vez de evitar colocar isso emviewDidAppear
José
Essa parece ser a maneira mais satisfatória e evita um flash, pois o título do botão Voltar é alterado para "" usando self.navigationItem.title = "" no controlador de chamada (dispositivos mais lentos). Além disso, a outra situação em que self.navigationItem.title = "" é completamente ignorada, fazendo a transição intermitente rapidamente para o controlador de exibição por meio de um comutador de guias do controlador de tabulação programaticamente.
FlimFlam Vir
22

O botão Voltar pertence ao controlador de exibição anterior, não ao apresentado atualmente na tela. Para modificar o botão Voltar, você deve atualizá-lo antes de pressionar, adicione viewdidload:

Swift 4:

self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: self, action: nil)
Mohammad Razipour
fonte
12

Você pode apenas modificar o NavigationItem no storyboard

insira a descrição da imagem aqui

No botão Voltar, adicione um espaço e pressione Enter.

Nota: Faça isso no VC anterior.

xhinoda
fonte
8

Swift 4 - Configure o botão Voltar antes de pressionar qualquer controlador de exibição

// if you want to remove the text
navigationItem.backBarButtonItem = UIBarButtonItem()

// if you want to modify the text to "back"
navigationItem.backBarButtonItem = UIBarButtonItem(title: "back", style: .plain, target: nil, action: nil)
budidino
fonte
8

Isso deve funcionar:

override func viewDidLoad() {
    super.viewDidLoad()

    var button = UIBarButtonItem(title: "YourTitle", style: UIBarButtonItemStyle.Bordered, target: self, action: "goBack")
    self.navigationItem.backBarButtonItem = button

}

func goBack()
{
    self.navigationController?.popViewControllerAnimated(true)
}

Embora não seja recomendado, pois na verdade substitui o backButton e também removeu a seta para trás e o gesto de furto.

Dejan Skledar
fonte
10
não é o caminho certo para fazê-lo, você está apenas substituindo o botão voltar
Yariv Nissim
Melhor fazê-lo a partir do construtor de interface
Rutger Huijsmans
7

Swift 4.2

Se você quiser alterar o texto do item do botão Voltar da barra de navegação, insira-o no viewDidLoadcontrolador ANTES daquele em que o botão Voltar aparece, NÃO no controlador de visualização em que o botão Voltar está visível.

 let backButton = UIBarButtonItem()
 backButton.title = "New Back Button Text"
 self.navigationController?.navigationBar.topItem?.backBarButtonItem = backButton

Se você deseja alterar o texto do título da barra de navegação atual, use o código abaixo (observe que este se torna o texto de volta padrão da visualização NEXT pressionada no controlador de navegação, mas esse texto de volta padrão pode ser substituído pelo código acima)

 self.title = "Navigation Bar Title"
ikbal
fonte
6

Existem duas maneiras.

1.No previousViewController.viewDidLoad ()

let backBarBtnItem = UIBarButtonItem()
backBarBtnItem.title = "back"
navigationItem.backBarButtonItem = backBarBtnItem

2.No currentViewController.viewDidAppear ()

let backBarBtnItem = UIBarButtonItem()
backBarBtnItem.title = "back"      
navigationController?.navigationBar.backItem?.backBarButtonItem = backBarBtnItem

Razão: backButtonvem navigationBar.backItem.backBarButtonItem, portanto, a primeira maneira é óbvia. No currentViewController.viewDidLoad (), não podemos obter a referência de backItem, porque em viewDidAppear (), o navigationBarpressionado navigationViewé stack. Assim, podemos fazer alterações nobackItem no currentViewController. viewDidAppear ()

Para mais detalhes, você pode ver o documento: UINavigationBar

Calcifer
fonte
3

No viewDidLoadmétodo do controlador de apresentação, adicione:

// hide navigation bar title in the next controller
let backButton = UIBarButtonItem(title: "", style:.Plain, target: nil, action: nil)
navigationItem.backBarButtonItem = backButton
Claus
fonte
2

embora essas respostas resolvam o problema, mas isso pode ser útil

class MainNavigatioController: UINavigationController {

    override func pushViewController(_ viewController: UIViewController, animated: Bool) {
        // first
        let backItem = UIBarButtonItem()
        backItem.title = "رجوع"
        self.viewControllers.last?.navigationItem.backBarButtonItem = backItem
        // then
        super.pushViewController(viewController, animated: animated)

    }

}
Ahmad Labeeb
fonte
2

Swift 4

Enquanto o ditado anterior para se preparar para segue está correto e é verdade que o botão voltar pertence ao VC anterior, é apenas adicionar um monte de código mais desnecessário.

A melhor coisa a fazer é definir o título do VC atual em viewDidLoad e definirá automaticamente o título do botão voltar corretamente no próximo VC. Essa linha funcionou para mim

navigationController?.navigationBar.topItem?.title = "Title"
Joel
fonte
2

Isso funciona para o Swift 5 :

self.navigationItem.backBarButtonItem?.title = ""

Observe que será eficaz para o próximo controlador de exibição pressionado, e não o atual no visor, por isso é muito confuso!

Além disso, verifique o storyboard e selecione o item de navegação do controlador de exibição anterior e digite algo no botão Voltar (Inspetor).

Saeed Ir
fonte
1

Tente isso ... vai funcionar ....

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    self.title = ""
}

O código acima oculta o texto e mostra apenas a seta para trás na barra de navegação.

Sarabjit Singh
fonte
0

Defina self.title = "" antes self.navigationController?.pushViewController(vc, animated: true).

米米米
fonte
0
override func viewWillAppear(_ animated: Bool) {

    self.tabBarController?.navigationItem.title = "Notes"

    let sendButton = UIBarButtonItem(title: "New", style: .plain, target: self, action: #selector(goToNoteEditorViewController))

    self.tabBarController?.navigationItem.rightBarButtonItem = sendButton
}

func goToNoteEditorViewController(){
   // action what you want
}

Espero que ajude!! #swift 3

Sathish Kumar Gurunathan
fonte
0

Se você estiver pressionando um controlador de visualização da página do controlador de visualização de página, não poderá atualizar o título do botão Voltar do controlador de navegação. Para resolver isso, crie um delegado de volta ao seu controlador de exibição pai (você também poderá atravessar a hierarquia do controlador de exibição no pai).

Além disso, os botões Voltar têm um limite de caracteres. Se você exceder esse limite de caracteres, o sistema assumirá o padrão "Voltar". Não será truncado para você. Por exemplo:

backItem.title = "Birthdays/Anniversaries" // Get's converted to "Back".
backItem.title = "Birthdays/Anniversa…" // Fits and shows as is.
Justin Domnitz
fonte
0

Swift 4

No meu caso, a solução foi limpar o item de navegação do Master View Controller antes de passar para o Child View Controller. E configure-o novamente se for mostrado novamente

MasterController

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationItem.title = "Master Title"
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    navigationItem.title = ""
}

E é assim que eu empurro um UIViewController e limpo o item do botão da barra traseira no controlador filho:

MasterController

let childController = ChildController(collectionViewLayout: UICollectionViewFlowLayout())
childController.navigationItem.backBarButtonItem?.title = ""
navigationController?.pushViewController(childController, animated: true)
Jorge Casariego
fonte
0

para Swift 4.2

let backItem = UIBarButtonItem()
backItem.title = ""
navigationItem.backBarButtonItem = backItem
Iryna Batvina
fonte
0

GOTCHA: Se você está tendo problemas com qualquer um dos muitos-estrelou sugestões, verifique se você está registrando suas UITableViewCells em viewDidLoad(), não deinit()

Womble
fonte
-1

Solução verificada e funciona no Swift 5

Abaixo, coloquei algumas soluções para casos diferentes:

1. Remova o texto do botão Voltar

A melhor solução para remover o texto do botão Voltar é adicionar viewDidLoad ():

navigationItem.backBarButtonItem = UIBarButtonItem()

2. Defina o próprio texto no botão Voltar

Caso você queira definir seu próprio título, faça-o definindo o título de backButton:

let backButton = UIBarButtonItem()
backButton.title = "My Title"
navigationItem.backBarButtonItem = backItem

3. Botão traseiro vazio em todos os VC

Se você deseja criar estilo comum em todo o aplicativo - para retornar a seta sem texto, crie um VC base para todos os seus Controladores de exibição:

class BaseViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        navigationItem.backBarButtonItem = UIBarButtonItem()
    }
}

A solução apresentada acima permite personalizar o botão voltar no futuro, se você quiser fazer alguma exceção posteriormente, adicionando variável adicional e substituindo-a no ViewController específico, f.ex:

class BaseViewController: UIViewController {

    var customBackButtonTitle: String?

    override func viewDidLoad() {
        super.viewDidLoad()

        var backButton = UIBarButtonItem()
        if let text = customBackButtonTitle {
            backButton.title = text
        }
        navigationItem.backBarButtonItem = backButton
    }
}
lukszar
fonte
-2

veloz 4

existe uma maneira de alterar o texto em backButton programaticamente a partir do viewController atual:

navigationController?.navigationBar.items![0].title = "some new text"
zslavman
fonte