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.