如何才能获得导航栏按钮?

时间:2015-08-06 02:35:29

标签: ios swift uinavigationcontroller

我有一个指向UIViewController的UINavigationController。在那个UIViewController中,我希望导航项目的右键是一个.Add UIBarButtonItem,它会分割到另一个名为" nextScene"的场景。

我的理解是我需要让行动成为" performSegueWithidentifier"方法,如果我想以编程方式创建此segue。这就是我所拥有的:

let plusButton = UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "performSegueWithIdentifier:")
self.navigationItem.setRightBarButtonItem(plusButton, animated: true)

进入另一个名为" nextScene"的场景的正确语法是什么?我的performSegueWithidentifier方法应如何处理?

编辑: 得到以下错误:无法识别的选择器发送到实例... 2015-08-06 07:57:18.534 .. [...] ***由于未捕获的异常终止应用程序' NSInvalidArgumentException',原因: ' - [... goToSegue:]:无法识别的选择器发送到实例....

以下是我用于segue的代码:

let plusButton = UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "goToSegue:")`

self.navigationItem.setRightBarButtonItem(plusButton, animated: true) }

func goToSegue() {
    performSegueWithIdentifier("segueName", sender: self)
}

2 个答案:

答案 0 :(得分:5)

  1. UIViewController之间创建segue(右键点击firstViewController并将其拖至secondviewcontroller
  2. Right Click on view controller and drag it to second view controller

    select segue action

    1. segue
    2. 指定标识符名称

      Give Identifier name

      1. 使用segue名称
      2. 执行segue

        现在,为了使用UIBarButtonItem执行segue,请将viewDidLoad方法中的以下代码添加到firstViewController

        override func viewDidLoad() {
            super.viewDidLoad()
        
            self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Add, target: self, action: "navigateToNextViewController")
            // Do any additional setup after loading the view, typically from a nib.
        }
        

        现在创建navigateToNextViewController方法并从该方法执行segue

        func navigateToNextViewController(){
            self.performSegueWithIdentifier("goNext", sender: self)
        }
        

答案 1 :(得分:2)

您可以在故事板中控制+从UIBarButtonItem拖动到UIViewController(或其他类型的控制器)。

enter image description here

如果您想通过代码执行此操作,则需要使用目标类中可以处理它的方法备份您的操作调用。 performSegueWithIdentifier是视图控制器的默认方法,所以我会调用另一个函数然后调用performSegueWithIdentifier,如下所示:

let plusButton = UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "plusBttnTouched:")

func plusBttnTouched(sender: UIBarButtonItem) {

    performSegueWithIdentifier(identifier: "segueNameHere", sender: self)

}

这是一个更新的代码示例:

故事板:

enter image description here

代码:

import UIKit

class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()

    // Create bar button item

    let plusButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Action, target: self, action: Selector("plusBttnTouched:"))

    self.navigationItem.rightBarButtonItems = [plusButton]

    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

//MARK: - Actions

func plusBttnTouched(sender: UIBarButtonItem) {

    dispatch_async(dispatch_get_main_queue(), { () -> Void in

        self.performSegueWithIdentifier("plusViewController", sender: self)
    })

}

}

在method参数中使用sender可以访问方法中已定义类型的实例。你说你想要这个,当你在选择器的末尾添加一个时,它不是必需的。