[ios] Swift에서 UIBarButtonItem에 대한 동작을 설정하는 방법

Swift에서 사용자 정의 UIBarButtonItem에 대한 작업을 어떻게 설정할 수 있습니까?

다음 코드는 탐색 모음에 버튼을 성공적으로 배치합니다.

var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:nil)
self.navigationItem.rightBarButtonItem = b

이제 func sayHello() { println("Hello") }버튼을 터치하면 전화하고 싶습니다 . 지금까지 나의 노력 :

var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:sayHello:)
// also with `sayHello` `sayHello()`, and `sayHello():`

과..

var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:@selector(sayHello:))
// also with `sayHello` `sayHello()`, and `sayHello():`

과..

var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:@selector(self.sayHello:))
// also with `self.sayHello` `self.sayHello()`, and `self.sayHello():`

참고 sayHello()IntelliSense를 나타납니다,하지만 일을하지 않습니다.

당신의 도움을 주셔서 감사합니다.

편집 : 후세를 위해 다음 작품 :

var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:"sayHello")



답변

Swift 2.2부터 컴파일러 시간 검사 선택자에 대한 특수 구문이 있습니다. 다음 구문을 사용합니다 #selector(methodName)..

Swift 3 이상 :

var b = UIBarButtonItem(
    title: "Continue",
    style: .plain,
    target: self,
    action: #selector(sayHello(sender:))
)

func sayHello(sender: UIBarButtonItem) {
}

메서드 이름이 어떻게 생겼는지 확실하지 않은 경우 매우 유용한 특수 버전의 복사 명령이 있습니다. 기본 메서드 이름 (예 : sayHello)에 커서를 놓고 Shift+ Control+ Option+를 누릅니다 C. 붙여 넣을 키보드에 ‘기호 이름’이 입력됩니다. 또한 누르고 있으면 Command유형도 포함하는 ‘정규화 된 기호 이름’이 복사됩니다.

스위프트 2.3 :

var b = UIBarButtonItem(
    title: "Continue",
    style: .Plain,
    target: self,
    action: #selector(sayHello(_:))
)

func sayHello(sender: UIBarButtonItem) {
}

이는 메서드 호출을 할 때 Swift 2.3에서 첫 번째 매개 변수 이름이 필요하지 않기 때문입니다.

swift.org의 구문에 대한 자세한 내용은 https://swift.org/blog/swift-2-2-new-features/#compile-time-checked-selectors를 참조하세요.


답변

Swift 4/5 예제

button.target = self
button.action = #selector(buttonClicked(sender:))

@objc func buttonClicked(sender: UIBarButtonItem) {

}


답변

Swift 5 및 iOS 13+ 프로그래밍 예제

  1. 함수를로 표시해야합니다. @objc아래 예제를 참조하십시오!
  2. 함수 이름 뒤에 괄호가 없습니다! 사용하십시오 #selector(name).
  3. private또는 public중요하지 않습니다. 비공개로 사용할 수 있습니다.

코드 예

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    let menuButtonImage = UIImage(systemName: "flame")
    let menuButton = UIBarButtonItem(image: menuButtonImage, style: .plain, target: self, action: #selector(didTapMenuButton))
    navigationItem.rightBarButtonItem = menuButton
}

@objc public func didTapMenuButton() {
    print("Hello World")
}


답변

이것이 조금 더 도움이 되길 바랍니다

막대 버튼을 별도의 파일 (모듈 방식의 경우)로 만들고 선택기를 뷰 컨트롤러에 다시 제공하려면 다음과 같이 할 수 있습니다.

유틸리티 파일

class GeneralUtility {

    class func customeNavigationBar(viewController: UIViewController,title:String){
        let add = UIBarButtonItem(title: "Play", style: .plain, target: viewController, action: #selector(SuperViewController.buttonClicked(sender:)));
      viewController.navigationController?.navigationBar.topItem?.rightBarButtonItems = [add];
    }
}

그런 다음 SuperviewController 클래스를 만들고 동일한 함수를 정의합니다.

class SuperViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
            // Do any additional setup after loading the view.
    }
    @objc func buttonClicked(sender: UIBarButtonItem) {

    }
}

기본 viewController (SuperviewController 클래스를 상속 함)에서 동일한 함수를 재정의합니다.

import UIKit

class HomeViewController: SuperViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override func viewWillAppear(_ animated: Bool) {
        GeneralUtility.customeNavigationBar(viewController: self,title:"Event");
    }

    @objc override func buttonClicked(sender: UIBarButtonItem) {
      print("button clicked")
    }
}

이제이 막대 버튼을 원하는 클래스에서 SuperViewController를 상속하십시오.

읽어 주셔서 감사합니다


답변

스위프트 5

UIBarButtonItemInterface Builder에서 생성 하고 콘센트를 항목에 연결하고 선택기를 프로그래밍 방식으로 바인딩하려는 경우.

대상과 선택기를 설정하는 것을 잊지 마십시오.

addAppointmentButton.action = #selector(moveToAddAppointment)
addAppointmentButton.target = self

@objc private func moveToAddAppointment() {
     self.presenter.goToCreateNewAppointment()
}


답변