以编程方式从UIBarButtonItem中截取

时间:2016-11-30 14:38:44

标签: ios swift segue selector 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. }

}

然后我从每个VC Helper.loadNavBarItems(vc: self)致电viewDidLoad()

我现在要做的是在按下其中一个按钮时触发一个segue(让我们假设它是个人资料按钮)。所以,我需要定义profile.action。因此,在Helper类中,我必须编写一个函数segueToProfile,它接受​​一个视图控制器(vc)并运行performSegueWithIdentifier

问题是,我还没有完全理解如何通过选择器传递不同类型的参数,我可能在谷歌搜索中表现不好但我找不到任何足够接近我的问题来理解实现这一目标。

非常感谢您的帮助。

供参考,this is the structure of my Storyboard

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

4 个答案:

答案 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

enter image description here

<强>输出:

enter image description here

<强>更新

如果您想连接没有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)