Programáticamente segue de UIBarButtonItem

Tengo tres controlleres de vista, todos con dos botones en los lados derecho e izquierdo de la barra de navigation, como se ve a continuación en uno de ellos.

Ejemplo VC

Estoy creando estos botones de forma progtwigda, y en lugar de escribir el código en cada controller de vista respectivo (VC), decidí escribir una class Helper que crea los botones.

// 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. } } 

Luego llamo a Helper.loadNavBarItems(vc: self) desde la vista de cada viewDidLoad() .

Lo que estoy tratando de hacer ahora es activar un segue cuando se presiona uno de los botones (supongamos que es el button de perfil). Entonces, necesito definir profile.action . Por lo tanto, en la class Helper, tengo que escribir una function segueToProfile que tome una vista contoller ( vc ) y ejecute performSegueWithIdentifier .

El problema es que no estoy entendiendo completamente cómo pasar diferentes types de parameters a través de selectores, y puede ser malo en Google, pero no puedo encontrar ninguna pregunta lo suficientemente cercana como la mía para que yo pueda entender cómo lograrlo.

Muchas gracias de antemano por su ayuda.

Como reference, esta es la estructura de mi Storyboard .

EDITAR: como se muestra en la captura de pantalla de la estructura de storyboard, ya he creado una segue desde cada uno de los tres controlleres de vista al controller de vista de destino.

No sé si entiendo su problema, pero para pasar datos entre viewControllers (embedded en un UINavigationController en su caso) usando segue, puede hacerlo en:

 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 }} 

Para agregar una acción a un UIBarButton , debe usar uno de sus inicializadores. Por ejemplo

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

En lugar de título, también puede configurar una image para ese button.

Puede crear barButtonItems con selectores:

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

Donde the didPressLeftButton es una function:

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

Para crear barButtonItem:

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

Para crear acción y segue para barButtonItem:

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

Nota: para perform segue , debe dar el segue identifier name de su storyboard.

introduzca la descripción de la imagen aquí

Salida:

introduzca la descripción de la imagen aquí

Actualizado:

Si desea conectar su destVC sin seguir, puede usar el siguiente método:

Nota: Para utilizar el método a continuación, debe configurar el storyBoard Id en el 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)