Пользовательские элементы навигации не отображаются на контроллере представления верхнего уровня - PullRequest
0 голосов
/ 12 июня 2018

У меня есть проект, в котором TableViewCells передается на разные контроллеры представления.В этом проекте я использую пользовательские навигационные контроллеры.Это код контроллера навигации в первом контроллере вида:

//Design of Header
        let nav_background = UIImage(named: "header_background")
        navigationController?.navigationBar.setBackgroundImage(nav_background, for: .default)
        navigationController?.navigationBar.layer.shadowOffset = CGSize(width: 0, height: 1)
        navigationController?.navigationBar.layer.shadowOpacity = 0.16
        navigationController?.navigationBar.layer.shadowRadius = 10

        let account = UIImage(named: "header_account")
        let imageView = UIImageView(image: account)
        let blankView = UIImageView()
        imageView.contentMode = .scaleAspectFit
        imageView.layer.shadowOffset = CGSize(width: -3, height: 3)
        imageView.layer.shadowOpacity = 0.16
        imageView.layer.shadowRadius = 10
        self.navigationController?.navigationBar.topItem?.rightBarButtonItem?.customView = imageView
        self.navigationController?.navigationBar.topItem?.leftBarButtonItem?.customView = blankView

Первый контроллер вида отображает только пользовательский фон и никаких других свойств.

Это код контроллера второго представления, который загружается при выборе ячейки в TableView:

//Design of Header
        let account = UIImage(named: "header_account")
        let accountView = UIImageView(image: account)
        let back = UIImage(named: "header_backarrow")
        let backView = UIImageView(image: back)
        navigationItem.leftBarButtonItem?.customView = backView
        navigationItem.rightBarButtonItem?.customView = accountView

Теоретически все должно быть заменено написанным здесь кодом и заголовкамиперечисленные в свойствах View Controller (Это работает для всех контроллеров представления, кроме первого.) Я все это беру прямо с веб-страницы Apple: https://developer.apple.com/documentation/uikit/uinavigationcontroller

Вот точные абзацы, на которые я ссылаюсь:

Левый элемент:

Если в новом контроллере представления верхнего уровня есть элемент пользовательской кнопки левой панели, этот элемент отображается.Чтобы указать пользовательский элемент кнопки левой панели, задайте свойство leftBarButtonItem элемента навигации контроллера представления.

Средний элемент:

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

Right Item:

Если новый контроллер представления верхнего уровня имеет настраиваемый элемент кнопки правой панели, этот элемент отображается.Чтобы указать пользовательский элемент кнопки правой панели, установите свойство rightBarButtonItem элемента навигации контроллера представления.

Кто-нибудь знает, как это исправить?Спасибо.

1 Ответ

0 голосов
/ 12 июня 2018

Ваш код не работает, потому что customView в большинстве случаев nil.

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

Например, из UIImage:

let accountItem = UIBarButtonItem(image: account, style: .plain, target: nil, action: nil)
self.navigationController?.navigationBar.topItem?.rightBarButtonItem = accountItem

Чтобы создать его из пользовательского представления, используйте:

let accountItem = UIBarButtonItem(image: imageView)
self.navigationController?.navigationBar.topItem?.rightBarButtonItem = accountItem

Обратите внимание, что это все еще может не сработать, если navigationController равно нулю или topItem равно нулю.

...