Swift 3.0 Добавление правой кнопки в панель навигации

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

var addButton: UIBarButtonItem = UIBarButtonItem(title: "test", style: .done, target: self, action: #selector(addTapped))

override func viewDidLoad() {
    super.viewDidLoad()

    let boool = true
    if boool {
        self.navigationItem.rightBarButtonItem = self.addButton
    }
    else {
        self.navigationItem.rightBarButtonItem = nil
    }
}

func addTapped(sender: AnyObject) {
    print("hjxdbsdhjbv")
}

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

Ответ 1

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

Чтобы получить доступ к self.navigationItem, ваш контроллер представления должен быть встроен в UINavigationController или быть частью иерархии. Если у вас нет необходимости в настраиваемой навигационной панели на отдельном контроллере представления, я предлагаю удалить это из интерфейса Builder, а затем убедиться, что любой контроллер вида, о котором идет речь, встроен в UINavigationController или он помещается в стек навигации из другой контроллер, встроенный в контроллер навигации, и затем вы должны увидеть свой UIBarButtonItem.

Ответ 2

Это просто. Поместите эту строку кода в viewDidLoad:

self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "test", style: .done, target: self, action: #selector(addTapped))

Обновлено для Swift 4 или более поздней версии:

Пользовательская функция:

@objc func action(sender: UIBarButtonItem) {
    // Function body goes here
}

(Пользовательский) Правый элемент панели кнопок:

self.navigationItem.rightBarButtonItem = UIBarButtonItem.init(title: "some_text", style: .done, target: self, action: #selector(self.action(sender:)))

(Пользовательский) Левый элемент панели кнопок:

self.navigationItem.leftBarButtonItem = UIBarButtonItem.init(title: "some_text", style: .done, target: self, action: #selector(self.action(sender:)))

Также вы можете добавить элементы кнопок системной панели примерно так: UIBarButtonItem.SystemItem Определяет системные изображения для элементов кнопок панели: .add,.done,.cancel,.edit,.save,.compose,.reply,.organize и Больше.

(Система) Правая панель кнопок:

self.navigationItem.rightBarButtonItem = UIBarButtonItem.init(barButtonSystemItem: UIBarButtonItem.SystemItem.add, target: self, action: #selector(self.action(sender:)))

(Система) Элемент левой панели кнопок:

self.navigationItem.leftBarButtonItem = UIBarButtonItem.init(barButtonSystemItem: UIBarButtonItem.SystemItem.add, target: self, action: #selector(self.action(sender:)))

Ответ 3

let rightBarButtonItem = UIBarButtonItem.init(image: UIImage(named: "EditImage"), style: .done, target: self, action: #selector(ViewController.call_Method))

self.navigationItem.rightBarButtonItem = rightBarButtonItem

Ответ 4

Во-первых, вам нужно подключить навигационную панель к IBOutlet, чтобы вы могли ссылаться на нее в своем коде. После этого этот код должен работать:

    let navigationItem = UINavigationItem(title: "Title")
    navigationItem.rightBarButtonItem = self.addButton
    navigationItem.hidesBackButton = true
    self.navigationBar.pushItem(navigationItem, animated: false)

Ответ 5

Swift 4.2;

Добавить viewController

override func viewDidLoad() {
        super.viewDidLoad()
        self.addNavigationBarButton(imageName: "ic_back", direction:.left)
 }

Добавьте Class вашего API или класс утилит

public func addNavigationBarButton(imageName:String,direction:direction){
    var image = UIImage(named: imageName)
    image = image?.withRenderingMode(.alwaysOriginal)
    switch direction {
    case .left:
        self.navigationItem.leftBarButtonItem = UIBarButtonItem(image: image, style:.plain, target: nil, action: #selector(goBack))
    case .right:
        self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: image, style:.plain, target: nil, action: #selector(goBack))
    }
}

@objc public func goBack() {
    self.navigationController?.popViewController(animated: true)
}

public enum direction {
    case right
    case left
}

Ответ 6

протестировано в Xcode 10.2, swift 5.0; Во-первых, я встроил свой ViewController в UINavigationController в IB. Затем во ViewDidLoad включите эти строки

self.title = "orange"
 self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(changeLayout)).

Примечание. Не удалось получить доступ к заголовку или кнопке добавления через контроллер навигации. Например: настройка заголовка - Self.navigationcontroller.navigationItem.title не работает,