Изменить изображение кнопки возврата ViewController для всех экранов

У меня есть этот код ниже, который меняет изображение кнопки "Назад" на следующем экране.

В моем приложении 30 экранов, и я хочу, чтобы кнопка "Назад" была одинаковой на всех 30 экранах. Возможно ли, что я не копирую и не вставляю этот код на все 30 экранов, а просто пишу его один раз и скорее использую его на 30 экранах.

Кроме того, код, прикрепленный к кнопке "Назад", должен прекрасно работать на всех экранах, когда я снова его

Я использую iOS 8 и Xcode 6.

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    let backButtonImage: UIImage = UIImage(named: "back")!
    var backBarItem: UIBarButtonItem = UIBarButtonItem(image: backButtonImage, style: UIBarButtonItemStyle.Plain, target: self, action: Selector("method"))

    segue.destinationViewController.navigationItem.leftBarButtonItem = backBarItem;
}

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

3 ответа

Вы можете изменить это глобально

UINavigationBar.appearance().backIndicatorImage = UIImage(named: "custom-back")
UINavigationBar.appearance().backIndicatorTransitionMaskImage = UIImage(named: "custom-back")

Или на контроллер навигации.

override func viewDidLoad() {
    super.viewDidLoad()

    navigationController?.navigationBar.backIndicatorImage = UIImage(named: "custom-back")
    navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "custom-back")  
}

Полная информация здесь https://sarunw.com/posts/how-to-change-back-button-image/

Вы можете использовать внешний вид ()

стриж

    let backImage = UIImage(named: "back")
    UINavigationBar.appearance().backIndicatorImage = backImage
    UINavigationBar.appearance().backIndicatorTransitionMaskImage = backImage
    UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedString.Key.foregroundColor:
        UIColor.white], for: .normal)
    UIBarButtonItem.appearance().tintColor = UIColor.green

Чтобы вообще изменить внешний вид UI-Elements в iOS, взгляните на UIAppearance. Таким образом, вы можете установить его один раз, и он будет везде в вашем приложении.

Я бы порекомендовал установить его в AppDelegate application:didFinishLaunchingWithOptions:,

Попробуй это:

let backImg: UIImage = UIImage(named: "back")!
UIBarButtonItem.appearance().setBackButtonBackgroundImage(backImg, forState: .Normal, barMetrics: .Default)

В моем приложении только один контроллер навигации, так что это может или не может быть полезным. Но я создал подкласс UINavigationController. Затем в этом подклассе я переопределяю метод pushViewController:

override func pushViewController(_ viewController: UIViewController, animated: Bool) {
    let pushingVC = viewControllers[viewControllers.count - 1]
    let backItem = UIBarButtonItem()
    backItem.title = ""
    pushingVC.navigationItem.backBarButtonItem = backItem
    super.pushViewController(viewController, animated: animated)
}

Это делает так, что каждый раз, когда viewController выдвигается из моего customNavigationController, он использует настраиваемую кнопку возврата для каждого представления. Вы должны убедиться, что вы изменили свой тип UINavigationControllers на свой собственный подкласс. Но это работает для меня в Swift 3.0.

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

Во-первых: вам нужна кнопка "Назад", аналогичная кнопкам в приложениях Apple по умолчанию. Для этого вам необходимо: а) получить ссылку на сцену назначения и ее контроллер вида. Я буду считать, что вы сделали это и установите его равным controller для дальнейшего использования. б) Вам нужно установить левый элемент панели кнопок. Установите его с помощью:

controller.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Insert Title Here!!", style: UIBarButtonItemStyle.Plain, target: nil, action: nil)

Поместите все это в prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) (вы также найдете место назначения с этим, вероятно, с segue.destinationViewController

Второе: вы хотите использовать изображение с именем "Назад" для всех элементов. Если это так, повторите шаг а) выше и вставьте этот удобный фрагмент кода:

UIBarButtonItem(image: "Back", style: UIBarButtonItemStyle.Plain, target: nil, action: nil)

Я также знаю, что вам не нужно копировать его, но это не так, как будто это компьютерная нагрузка в любом случае, и это, вероятно, самое простое.

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

Четвертое. Вы действительно, действительно, не хотите ничего копировать, даже если это не так сложно. Если это так, вы можете создать подкласс UIViewController с вашим собственным пользовательским классом, добавить код, который я упоминал выше, а затем создать подкласс всех ваших будущих классов UIView следующим образом. Если честно, я не совсем уверен, что это сработает и кажется излишне трудоемким, но решать вам.

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

Другие вопросы по тегам