以编程方式从UIBarButtonItem继续
我有三个视图控制器,每个都在导航栏的右侧和左侧各有两个button,如下面其中一个所示。
我以编程方式创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)