以编程方式从UIBarButtonItem继续

我有三个视图控制器,每个都在导航栏的右侧和左侧各有两个button,如下面其中一个所示。

示例VC

我以编程方式创build这些button,而不是编写代码在每个相应的视图控制器(VC),我决定写一个助手类,创buildbutton。

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

然后,我从每个VC的viewDidLoad()调用Helper.loadNavBarItems(vc: self) viewDidLoad()

我现在想要做的是当按下其中一个button时触发一个继续(让我们假设它是configuration文件button)。 所以,我需要定义profile.action 。 所以,在Helper类中,我必须编写一个函数segueToProfile ,它接受一个视图控制器( vc )并运行performSegueWithIdentifier

问题是,我不完全理解如何通过select器传递不同types的参数,我可能在Google上很糟糕,但我找不到任何接近我的问题,以了解如何实现这一点。

非常感谢您的帮助。

作为参考, 这是我的故事板的结构 。

编辑:如故事板结构截图所示,我已经从三个视图控制器中的每一个创buildsegue目标视图控制器。

我不知道如果我理解你的问题,但使用segue在viewControllers之间(在你的情况embedded在一个UINavigationController )之间传递数据,你可以这样做:

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

要添加一个动作到一个UIBarButton你应该使用它的一个初始化器。 例如

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

您也可以将图像设置为该button,而不是标题。

您可以使用select器创buildbarButtonItems:

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

didPressLeftButton是一个函数:

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

要创buildbarButtonItem:

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

为barButtonItem创build动作和继续:

  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

在这里输入图像说明

输出:

在这里输入图像说明

更新:

如果你想连接你的destVC没有segue你可以使用下面的方法:

注意:要使用下面的方法,您必须在identity inspector设置storyBoard Id

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