Swift'de UIBarButtonItem için eylem nasıl ayarlanır


89

Swift'deki özel bir UIBarButtonItem için eylem nasıl ayarlanabilir?

Aşağıdaki kod, düğmeyi başarıyla gezinti çubuğuna yerleştirir:

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

Şimdi func sayHello() { println("Hello") }düğmeye dokunulduğunda aramak istiyorum . Şimdiye kadarki çabalarım:

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

ve..

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

ve..

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

Not sayHello()intellisense görünür, ancak işi yapmaz.

Yardımınız için teşekkürler.

DÜZENLEME: Gelecek nesil için aşağıdaki eserler:

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

4
seçicileri sadece bir dizeye koyarak hızlı bir şekilde geçersiniz,action: "sayHello"
Jiaaro

Çok teşekkür ederim. Bunu çıkarmak için baskı altındayım ve hayal kırıklığına uğradım.
kmiklas

1
Bu soru daha önce Swift'de @selector () ifadesinin bir kopyası olarak işaretlenmiş miydi? . Bununla birlikte, bu soru özellikle sorulurken UIBarButtonItemdiğeri sormaz. Yeni başlayanların tüm kullanımlarını genelleştirmelerini selectorzorunlu kılmak onlar için zor olabilir, bu yüzden insanların bu soruyu güncel tutabilmesi için yinelenen durumu kaldırıyorum.
Suragch

Yanıtlar:


157

Swift 2.2'den itibaren, derleyici tarafından denetlenen seçiciler için özel bir sözdizimi vardır. Bu sözdizimini kullanır: #selector(methodName).

Swift 3 ve sonrası:

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

func sayHello(sender: UIBarButtonItem) {
}

Yöntem adının nasıl görünmesi gerektiğinden emin değilseniz, çok yardımcı olan özel bir copy komut sürümü vardır. İmlecinizi temel yöntem adında bir yere getirin (ör. SayHello) ve Shift+ Control+ Option+ tuşlarına basın C. Bu, yapıştırılmak üzere klavyenize 'Sembol Adı'nı koyar. Ayrıca elinizde tutarsanız Command, türü de içerecek olan 'Nitelikli Sembol Adı'nı kopyalayacaktır.

Swift 2.3:

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

func sayHello(sender: UIBarButtonItem) {
}

Bunun nedeni, bir yöntem çağrısı yaparken Swift 2.3'te ilk parametre adının gerekli olmamasıdır.

Swift.org adresinde sözdizimi hakkında daha fazla bilgi edinebilirsiniz: https://swift.org/blog/swift-2-2-new-features/#compile-time-checked-selectors


11
Eylem işlevinin özel olamayacağını belirtmek isterim ! Neden olduğundan emin değilim, ancak bazı özel işlevlerin adını
vermişsem

Bunu anladım: "methodSignatureForSelector'ı uygulamıyor"
AlamoPS

1
@AlamoPS Eğer iki nokta üst üste ile 2. sürümü kullanıyorsanız, işlev parametresi türlerinin, yaptığınız işlem ne olursa olsun eşleştiğinden emin olmanız gerekir.
Jason

1
@RyanForsyth Dizi aslında Selector("sayHello")Swift tarafından perde arkasına çevriliyor .
fatuhoku

2
Bu cevap güncel değil.
Dan Loewenherz

34

Swift 4/5 örneği

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

@objc func buttonClicked(sender: UIBarButtonItem) {
        
}

5
Bu doğru, Swift 4 @objciçin fonksiyon bildirimine eklemeniz gerekiyor . Swift 4'e kadar bu, dolaylı olarak çıkarıldı.
Jonathan Cabrera

1
button.target = self
Mahesh

@Mahesh'in hedefi belirlemesine gerek yok
norbDEV

Swift 5 için @norbDEV hedefi gerekiyor
Biasi Wiga

3

Swift 5 ve iOS 13+ Programatik Örnek

  1. İşlevinizi ile işaretlemelisiniz @objc, aşağıdaki örneğe bakın!
  2. İşlev adından sonra parantez yok! Sadece kullan #selector(name).
  3. privateya publicda önemli değil; özel kullanabilirsiniz.

Kod Örneği

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

Bu biraz daha yardımcı olabilir

Bar düğmesini ayrı bir dosyada (modüler yaklaşım için) yapmak ve seçiciyi görüntü denetleyicinize geri vermek istiyorsanız, şunu yapabilirsiniz: -

Yardımcı Program Dosyanız

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];
    }
}

Sonra bir SuperviewController sınıfı oluşturun ve üzerinde aynı işlevi tanımlayın.

class SuperViewController: UIViewController {

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

    }
}

ve (SuperviewController sınıfınızı devralan) temel viewController'ımızda aynı işlevi geçersiz kılar

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

Şimdi SuperViewController'ı bu barut düğmesini istediğiniz sınıfta devralın.

Okuduğunuz için teşekkürler


0

Swift 5

yarattıysan UIBarButtonItemArayüz Oluşturucu'da ve çıkışı öğeye bağladıysanız ve seçiciyi programlı olarak bağlamak istiyorsanız.

Hedef ve seçiciyi ayarlamayı unutmayın.

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

@objc private func moveToAddAppointment() {
     self.presenter.goToCreateNewAppointment()
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.