Bagaimana tindakan untuk UIBarButtonItem kustom di Swift disetel?
Kode berikut berhasil menempatkan tombol di bilah navigasi:
var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:nil)
self.navigationItem.rightBarButtonItem = b
Sekarang, saya ingin menelepon func sayHello() { println("Hello") }
saat tombol disentuh. Upaya saya sejauh ini:
var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:sayHello:)
// also with `sayHello` `sayHello()`, and `sayHello():`
dan..
var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:@selector(sayHello:))
// also with `sayHello` `sayHello()`, and `sayHello():`
dan..
var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:@selector(self.sayHello:))
// also with `self.sayHello` `self.sayHello()`, and `self.sayHello():`
Catatan yang sayHello()
muncul di Intellisense, tapi tidak berhasil.
Terima kasih atas bantuan Anda.
EDIT: Untuk anak cucu, karya berikut:
var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:"sayHello")
ios
swift
action
uibarbuttonitem
kmiklas
sumber
sumber
action: "sayHello"
UIBarButtonItem
sementara yang lain tidak. Mewajibkan pemula untuk menggeneralisasi semua penggunaanselector
bisa sulit bagi mereka, jadi saya menghapus status duplikat sehingga orang dapat terus memperbarui pertanyaan ini.Jawaban:
Mulai dari Swift 2.2, ada sintaks khusus untuk pemilih yang diperiksa waktu kompiler. Ia menggunakan sintaks:
#selector(methodName)
.Swift 3 dan yang lebih baru:
var b = UIBarButtonItem( title: "Continue", style: .plain, target: self, action: #selector(sayHello(sender:)) ) func sayHello(sender: UIBarButtonItem) { }
Jika Anda tidak yakin seperti apa nama metode itu, ada versi khusus dari perintah salin yang sangat membantu. Letakkan kursor Anda di suatu tempat di nama metode dasar (misalnya sayHello) dan tekan Shift+ Control+ Option+ C. Itu menempatkan 'Nama Simbol' pada keyboard Anda untuk disisipkan. Jika Anda juga menahannya, Commanditu akan menyalin 'Nama Simbol yang Memenuhi Syarat' yang akan menyertakan jenisnya juga.
Swift 2.3:
var b = UIBarButtonItem( title: "Continue", style: .Plain, target: self, action: #selector(sayHello(_:)) ) func sayHello(sender: UIBarButtonItem) { }
Ini karena nama parameter pertama tidak diperlukan di Swift 2.3 saat melakukan panggilan metode.
Anda dapat mempelajari lebih lanjut tentang sintaks di swift.org di sini: https://swift.org/blog/swift-2-2-new-features/#compile-time-checked-selectors
sumber
Selector("sayHello")
balik layar oleh Swift.Contoh Swift 4/5
button.target = self button.action = #selector(buttonClicked(sender:)) @objc func buttonClicked(sender: UIBarButtonItem) { }
sumber
@objc
deklarasi fungsi. Hingga Swift 4 ini secara implisit disimpulkan.button.target = self
Contoh Terprogram Swift 5 & iOS 13+
@objc
, lihat contoh di bawah ini!#selector(name)
.private
ataupublic
tidak penting; Anda dapat menggunakan pribadi.Contoh Kode
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") }
sumber
Semoga yang satu ini lebih membantu
Misalkan jika Anda ingin membuat tombol bilah dalam file terpisah (untuk pendekatan modular) dan ingin mengembalikan selektor ke viewcontroller, Anda dapat melakukan seperti ini: -
File Utilitas Anda
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]; } }
Kemudian buat kelas SuperviewController dan tentukan fungsi yang sama di atasnya.
class SuperViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } @objc func buttonClicked(sender: UIBarButtonItem) { } }
dan Dalam viewController dasar kami (yang mewarisi kelas SuperviewController Anda) mengganti fungsi yang sama
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") } }
Sekarang hanya mewarisi SuperViewController di kelas mana pun yang Anda inginkan barbutton ini.
Terima kasih sudah membaca
sumber
Cepat 5
jika Anda telah membuat
UIBarButtonItem
di Interface Builder dan Anda menghubungkan outlet ke item dan ingin mengikat selektor secara terprogram.Jangan lupa tetapkan target dan selector.
addAppointmentButton.action = #selector(moveToAddAppointment) addAppointmentButton.target = self @objc private func moveToAddAppointment() { self.presenter.goToCreateNewAppointment() }
sumber