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


89

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")

4
당신은, 문자열의 선택을 넣어 신속한에서 선택기를 전달action: "sayHello"
Jiaaro

정말 고맙습니다. 나는 이것을 꺼내야한다는 압박을 받고 있고 좌절하고 있었다.
kmiklas

1
이 질문은 이전 에 Swift에서 @selector () 의 중복으로 표시 되었습니까? . 그러나이 질문은 UIBarButtonItem다른 질문에는 구체적으로 묻지 않습니다. 초보자에게 모든 용도를 일반화하도록 요구하는 selector것은 어려울 수 있으므로 사람들이이 질문을 최신 상태로 유지할 수 있도록 중복 상태를 제거하고 있습니다.
Suragch

답변:


157

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를 참조하세요.


11
액션 함수는 비공개 일 수 없습니다 . 난 정말 확실 왜,하지만 난 항상 어떤 개인 함수의 이름을 제공 한 경우에 오류 얻을
maddob

나는이 있어요 "methodSignatureForSelector를 구현하지 않습니다"
AlamoPS

1
@AlamoPS 콜론과 함께 두 번째 버전을 사용하는 경우 함수 매개 변수 유형이 처리중인 작업에 대해 일치하는지 확인해야합니다.
Jason

1
@RyanForsyth 문자열은 Selector("sayHello")어쨌든 Swift에 의해 실제로 뒤에서 번역됩니다 .
fatuhoku

2
이 답변은 구식입니다.
Dan Loewenherz

34

Swift 4/5 예제

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

@objc func buttonClicked(sender: UIBarButtonItem) {
        
}

5
맞습니다. Swift 4의 @objc경우 함수 선언 에 추가 해야합니다. Swift 4까지 이것은 암시 적으로 추론되었습니다.
Jonathan Cabrera

1
button.target = self
Mahesh

@Mahesh는 목표를 설정할 필요가 없습니다
norbDEV

@norbDEV 대상은 스위프트 5 필요
BIASI Wiga

3

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")
}

0

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

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

유틸리티 파일

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를 상속하십시오.

읽어 주셔서 감사합니다


0

스위프트 5

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

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

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

@objc private func moveToAddAppointment() {
     self.presenter.goToCreateNewAppointment()
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.