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+ 프로그래밍 예제
- 함수를로 표시해야합니다.
@objc
아래 예제를 참조하십시오! - 함수 이름 뒤에 괄호가 없습니다! 사용하십시오
#selector(name)
. 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
UIBarButtonItem
Interface Builder에서 생성 하고 콘센트를 항목에 연결하고 선택기를 프로그래밍 방식으로 바인딩하려는 경우.
대상과 선택기를 설정하는 것을 잊지 마십시오.
addAppointmentButton.action = #selector(moveToAddAppointment)
addAppointmentButton.target = self
@objc private func moveToAddAppointment() {
self.presenter.goToCreateNewAppointment()
}