2016-11-30 9 views
4

У меня есть три контроллера вида, все с двумя кнопками, каждый с правой и левой сторон панели навигации, как показано ниже на одном из них.Программный выход из UIBarButtonItem

Example VC

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

// Note: I am using FontAwesome as a third-party library. 

class Helper: NSObject { 

    static func loadNavBarItems(vc: UIViewController) { 
     let profileButton = UIBarButtonItem() 
     let addButton = UIBarButtonItem() 

     let attributes = [NSFontAttributeName: UIFont.fontAwesome(ofSize: 20)] as [String: Any] 

     profileButton.setTitleTextAttributes(attributes, for: .normal) 
     addButton.setTitleTextAttributes(attributes, for: .normal) 

     profileButton.title = String.fontAwesomeIcon(name: .userCircle) 
     addButton.title = String.fontAwesomeIcon(name: .plus) 

     vc.navigationItem.leftBarButtonItem = profileButton 
     vc.navigationItem.rightBarButtonItem = addButton 
    } 

    func segueToProfile(vc: UIViewController) { // I need help here. } 

} 

Я тогда называть Helper.loadNavBarItems(vc: self) от каждого ВК viewDidLoad().

То, что я пытаюсь сделать сейчас, - вызвать таймер при нажатии одной из кнопок (предположим, что это кнопка профиля). Итак, мне нужно определить profile.action. Итак, в классе Helper мне нужно написать функцию segueToProfile, которая принимает просмотр Contoller (vc) и запускает performSegueWithIdentifier.

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

Большое спасибо за вашу помощь.

Для справки, this is the structure of my Storyboard.

EDIT: Как показано на скриншоте структуры раскадровки, я уже создал segue от каждого из трех контроллеров представления до контроллера представления назначения.

+0

Какие параметры можно выбрать с помощью селектора, который вы хотите отправить? Также в вашем раскадровке вы представляете навигационный контроллер. Таким образом, вы должны понимать, что destinationController будет NavigationController, а не ViewCotnroller. Другое дело, что, вероятно, вы должны создать расширение для UIViewController и заменить весь этот код создания и назначения BarButtons в него. Таким образом, вы избегаете пропускать параметр UIViewController в 'loadNavBarItems' func –

+0

@noir_eagle Спасибо, но моя проблема заключается в понимании действий и селекторов UIBarButtonItem. Я пытаюсь вызвать segue, когда один из UIBarButtonItems прослушивается, и я пытаюсь понять, как передавать параметры в селектор при использовании 'profileButton.action' –

+0

Этот навигационный контроллер с этими кнопками на каждой странице ? Или только один ViewController? –

ответ

0

я не знаю, если я понимаю вашу проблему, но и для передачи данных между viewControllers (встроенный в UINavigationController в вашем случае) с помощью SEGUE, вы можете сделать это в:

override func prepare(for segue: UIStoryboardSegue, sender: Any?){ 
    if(segue.identifier == "yourIdentifier"){ 
     let navPreview : UINavigationController = segue.destination as! UINavigationController 
     let preview : YourViewController = navPreview.viewControllers[0] as! YourViewController 
}} 
+0

Спасибо Alessio, но моя проблема связана с действиями и селекторами UIBarButtonItem. Я пытаюсь вызвать segue, когда один из UIBarButtonItems используется. –

+0

нормально, но есть ли у вас проблемы с вызовом segue для нового контроллера? потому что в этом случае из раскадровки вы можете использовать управление + перетащить на свой контроллер и проверить (отношение segue (контроллеры просмотра)) и автоматически Xcode создает один сеанс из tabbarController в UIViewController –

0

Чтобы добавить действие на UIBarButton вы должны использовать один из своих инициализаторов. Например

let profileButton = UIBarButtonItem(title: "Your title", style: .done, target: self, action: #selector("Call your function to push View controller")) 

Вместо названия, вы можете также установить изображение на эту кнопку.

+0

Спасибо, но можете ли вы показать мне, как добавить действие, которое принимает параметр? –

0

Вы можете создать barButtonItems с селекторов:

let leftBarButton = UIBarButtonItem(image: image, landscapeImagePhone: image, style: UIBarButtonItemStyle.bordered, target: self, action: #selector(didPressLeftButton)) 

Если didPressLeftButton функция:

func didPressLeftButton(){ 
     print("Did press left button") 
} 
+0

Спасибо, но можете ли вы показать мне, как добавить действие, которое принимает параметр? –

+0

Посмотрите на учебник здесь, у них есть пара хороших примеров с параметрами: https: //www.bignerdranch.com/blog/hannibal-selector/ –

+0

Еще одна мысль @ FaresK.A. - Вам действительно нужно передать параметры? Если в каждом представлении есть свои собственные кнопки навигации, возможно, присоедините функциональность didPressLeft, didPressRight к контроллеру представления. Чтобы сделать его более многоразовым, вы можете подклассифицировать его с помощью контроллера базового представления, который обрабатывал бы создание кнопок. –

0

Для создания barButtonItem:

navigationItem.rightBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: self, action: #selector(ProfileButtonTapped)) 

Чтобы создать действие и непосредственно перейти к barButtonItem :

func ProfileButtonTapped() { 
    print("Button Tapped") 
    performSegue(withIdentifier: "YourSegueIdentifierName", sender: self) 
    //If you want pass data while segue you can use prepare segue method 
    } 

Примечания: Для perform segue вы должны дать segue identifier name от раскадровки.

enter image description here

Выход:

enter image description here

Обновлено:

Если вы хотите подключить destVC без Segue вы можете использовать ниже метод:

N ote: Чтобы использовать ниже метод, вы должны установить storyBoard Id в identity inspector.

let storyboard = UIStoryboard(name: "Main", bundle: nil) 
let DestVC = storyboard.instantiateViewController(withIdentifier: "DestVcName") as! DestVcName //UINavigationController 
self.present(DestVC, animated: true, completion: nil) 

 Смежные вопросы

  • Нет связанных вопросов^_^