我有三个视图控制器,导航栏的左右两侧各有两个按钮,如下图所示。
我以编程方式创建这些按钮,而不是在每个相应的视图控制器(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. }
}
然后我从每个VC Helper.loadNavBarItems(vc: self)
致电viewDidLoad()
。
我现在要做的是在按下其中一个按钮时触发一个segue(让我们假设它是个人资料按钮)。所以,我需要定义profile.action
。因此,在Helper类中,我必须编写一个函数segueToProfile
,它接受一个视图控制器(vc
)并运行performSegueWithIdentifier
。
问题是,我还没有完全理解如何通过选择器传递不同类型的参数,我可能在谷歌搜索中表现不好但我找不到任何足够接近我的问题来理解实现这一目标。
非常感谢您的帮助。
供参考,this is the structure of my Storyboard。
编辑:如故事板结构截图所示,我已经从三个视图控制器中的每一个创建了一个segue到目标视图控制器。
答案 0 :(得分:0)
我不知道我是否理解你的问题,但是为了使用segue在viewControllers(在你的案例中嵌入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
}}
答案 1 :(得分:0)
要向UIBarButton
添加操作,您应该使用其中一个初始值设定项。
例如
let profileButton = UIBarButtonItem(title: "Your title", style: .done, target: self, action: #selector("Call your function to push View controller"))
您也可以将图像设置为该按钮,而不是标题。
答案 2 :(得分:0)
您可以使用选择器创建barButtonItem:
let leftBarButton = UIBarButtonItem(image: image, landscapeImagePhone: image, style: UIBarButtonItemStyle.bordered, target: self, action: #selector(didPressLeftButton))
didPressLeftButton是一个函数:
func didPressLeftButton(){
print("Did press left button")
}
答案 3 :(得分:0)
创建barButtonItem:
navigationItem.rightBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: self, action: #selector(ProfileButtonTapped))
为barButtonItem创建动作和segue:
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
。
<强>输出:强>
<强>更新强>
如果您想连接没有segue的destVC,可以使用以下方法:
注意:要使用以下方法,您必须在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)