Как полностью удалить ярлык на & ldquo; back button & rdquo; UINavigationController? [Дубликат]

Это очень распространенная проблема, с которой мы сталкиваемся, борясь с «таинствами» JavaScript.

Давайте начнем с простой функции JavaScript:

function foo(){
// do something 
 return 'wohoo';
}

let bar = foo(); // bar is 'wohoo' here

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

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

function foo(){
 setTimeout( ()=>{
   return 'wohoo';
  }, 1000 )
}

let bar = foo() // bar is undefined here

Итак, вы идете, эта задержка просто сломала функциональность, которую мы ожидали! Но что именно произошло? Ну, на самом деле это довольно логично, если вы посмотрите на код. функция foo() после выполнения ничего не возвращает (таким образом, возвращаемое значение равно undefined), но оно запускает таймер, который выполняет функцию после 1s, чтобы вернуть «wohoo». Но, как вы можете видеть, значение, присвоенное бару, является немедленно возвращенным материалом из foo (), а не что-либо еще, что приходит позже.

Итак, как мы решаем эту проблему?

Давайте попросим нашу функцию для ОБЕЩАНИЯ. Обещание действительно о том, что это означает: это означает, что функция гарантирует, что вы предоставите любой результат, который он получит в будущем. поэтому давайте посмотрим на это в нашей маленькой проблеме выше:

function foo(){
   return new Promise( (resolve, reject) => { // I want foo() to PROMISE me something
    setTimeout ( function(){ 
      // promise is RESOLVED , when exececution reaches this line of code
       resolve('wohoo')// After 1 second, RESOLVE the promise with value 'wohoo'
    }, 1000 )
  })
}

let bar ; 
foo().then( res => {
 bar = res;
 console.log(bar) // will print 'wohoo'
});

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

56
задан Parth Bhatt 28 April 2015 в 07:27
поделиться

16 ответов

Если вы хотите стрелку назад, поэтому следующий код помещается в AppDelegate файл в метод didFinishLaunchingWithOptions.

For Objective-C

 [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault];

For Swift

let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)

Еще одна опция приведена ниже.

В Objective C

self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];

В Swift

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

UPDATE:

    let BarButtonItemAppearance = UIBarButtonItem.appearance()

    let attributes: [NSAttributedStringKey: Any] = [
    BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
            NSAttributedStringKey.font: UIFont.systemFont(ofSize: 0.1),
            NSAttributedStringKey.foregroundColor: UIColor.clear]

    BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .normal)
    BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .highlighted)

UPDATE SWIFT 4.1:

    let attributes = [NSAttributedStringKey.font:  UIFont(name: "Helvetica-Bold", size: 0.1)!, NSAttributedStringKey.foregroundColor: UIColor.clear]

    BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .normal)
    BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .highlighted)

Использование Offset

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-1000, 0), for:UIBarMetrics.default)

Возможно, ваша проблема была решена.

Счастливое кодирование.

89
ответ дан Nimit Parekh 27 August 2018 в 18:17
поделиться

Вы можете использовать xcode 8 и swift 3.0

self.navigationController?.navigationBar.backItem?.title = " "
9
ответ дан Anit Kumar 27 August 2018 в 18:17
поделиться

Вы можете создать подкласс для всех UIViewController s, для которых вы хотите выполнить это поведение, и в подклассе viewDidLoad:

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationItem.backBarButtonItem = UIBarButtonItem(
        title: "", style: .plain, target: nil, action: nil)
}

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

3
ответ дан Connor 27 August 2018 в 18:17
поделиться
let barAppearace = UIBarButtonItem.appearance()
barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), for:UIBarMetrics.default)

использовал эту строку кода в swift 3.0

6
ответ дан Eiko 27 August 2018 в 18:17
поделиться

Swift 3:

self.navigationItem.backBarButtonItem = UIBarButtonItem(title:"", style:.plain, target:nil, action:nil)
2
ответ дан FelixSFD 27 August 2018 в 18:17
поделиться

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

Итак, сначала создайте класс расширения UIViewController с функцией для удаления назад и добавить пользовательскую кнопку возврата:

extension UIViewController {

func setBackButton() {
    navigationController?.navigationBar.backIndicatorImage = R.image.backArrow()
    navigationController?.navigationBar.backIndicatorTransitionMaskImage = R.image.backArrow()
    navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
}

Во-вторых, мы можем просто вызвать эту функцию в viewDidLoad каждого контроллера просмотра, в котором вы нуждаетесь.

5
ответ дан Harry Bloom 27 August 2018 в 18:17
поделиться

Я не был удовлетворен решением setBackButtonTitlePositionAdjustment, поэтому вот быстрая альтернатива, чтобы скрыть все тексты обратной кнопки во всей аппликации:

    UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: barbuttonFont, NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Normal)
    UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: barbuttonFont, NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Highlighted)

Вы должны были бы вызвать их из AppDelegate ] в функции didFinishLaunchingWithOptions.

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

-4
ответ дан Juan Ariza 27 August 2018 в 18:17
поделиться

Я использую эту строку кода в файле AppDelegate в didFinishLaunchingWithOptions для удаления подлодки title.

Swift 2.x

let barAppearace = UIBarButtonItem.appearance()
barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), forBarMetrics:UIBarMetrics.Default)

Swift 3.x

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), for:UIBarMetrics.default)

Swift 4.x

UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
    UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: UIControlState.highlighted)
40
ответ дан Karthickkck 27 August 2018 в 18:17
поделиться

Работает как заклинание Swift 3

self.navigationController?.navigationBar.topItem?.title = " "
39
ответ дан MaheshBabu 27 August 2018 в 18:17
поделиться

это просто. поместите пробел в заголовок кнопки «Назад» и готов. Помните, что это должно быть в предыдущем представлении, где вы хотите удалить текст.

4
ответ дан oscar castellon 27 August 2018 в 18:17
поделиться

Просто нужно перейти к вашему Parent ViewController, из которого зависят ваши другие ViewControllers.

override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(true)
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)}
5
ответ дан Pravin Kamble 27 August 2018 в 18:17
поделиться

Обычно я добавляю или изменяю кнопку «Назад» в viewDidLoad из UIViewController.

Что-то вроде этого должно работать:

let leftButton = UIBarButtonItem(title: "Back", style:     UIBarButtonItemStyle.Plain, target: self, action: "closeView:")
self.navigationItem.leftBarButtonItem = leftButton

Не забудьте изменить и реализовать функцию, которую она вызвала, чтобы закрыть представление.

Еще проще , просто измените название:

self.navigationItem.leftBarButtonItem.title = "Back"
4
ответ дан pteofil 27 August 2018 в 18:17
поделиться

Просто используйте это:

func removeBackButton(vc:UIViewController) {
        let button = UIButton.init(type: .custom)
        button.setImage(UIImage.init(named:""), for: .normal)
        let leftBarButton = UIBarButtonItem.init(customView: button)
        vc.navigationItem.leftBarButtonItem = leftBarButton
}

Поэтому вызовите этот метод в viewDidLoad:

override func viewDidLoad() {
        super.viewDidLoad()
     removeBackButton(vc:self)
}
0
ответ дан reza_khalafi 27 August 2018 в 18:17
поделиться

Вы можете добавить это расширение в UIViewController И затем вызвать эту функцию в каждом представленииDidLoad (), например: self.updateBackButton ()

extension UIViewController {
func updateBackButton(){
    if self.navigationController != nil {
        self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .done, target: self, action: nil)
    }
}}
0
ответ дан Talha Ahmad Khan 27 August 2018 в 18:17
поделиться

Я не знаю, почему, но я нашел проблему с укрытием названия кнопки в iPhone плюсы, но в устройстве без плюсов отображается правильно с

leftBarButtonItem.title = ""

. Поэтому я нашел простой способ. Установлен цвет оттенка для очистки в NavigationBar NavigationViewController при автоопределении. Это может быть проблемой, если вы используете значки или текстовые фрагменты с оттенком. Но в моем случае я не использую его как все.

0
ответ дан Vasily Avilov 27 August 2018 в 18:17
поделиться

Swift 4

Просто скопируйте этот код в didFinishLaunchingWithOptions launchOptions

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-1000.0, 0.0), for: .default)
0
ответ дан Vivek 27 August 2018 в 18:17
поделиться