Swift içinde @ selector ()?


659

Bir oluşturmaya çalışıyorum NSTimerin Swiftama bazı sorun yaşıyorum.

NSTimer(timeInterval: 1, target: self, selector: test(), userInfo: nil, repeats: true)

test() aynı sınıftaki bir işlevdir.


Editörde bir hata alıyorum:

Sağlanan bağımsız değişkenleri kabul eden 'init' için aşırı yük bulunamadı

Ben değiştirdiğinizde selector: test()için selector: nilhata kaybolana.

Denedim:

  • selector: test()
  • selector: test
  • selector: Selector(test())

Ama hiçbir şey işe yaramıyor ve referanslarda bir çözüm bulamıyorum.


11
selector: test()testdönüş değerini çağırır ve selectorargümana iletir.
Michael Dorst

Yanıtlar:


930

Swift'in kendisi seçiciler kullanmaz - Objective-C'de seçicilerin kullandığı birkaç tasarım deseni Swift'te farklı çalışır. (Örneğin, protokol türleri veya is/ astestleri yerine isteğe bağlı zincirleme respondsToSelector:kullanın ve performSelector:daha iyi tür / bellek güvenliği yerine mümkün olan yerlerde kapatma kullanın .)

Ancak, zamanlayıcılar ve hedef / eylem modeli de dahil olmak üzere seçicileri kullanan bir dizi önemli ObjC tabanlı API vardır. Swift, Selectorbunlarla çalışmak için tür sağlar. (Swift bunu otomatik olarak ObjC SELtürü yerine kullanır .)

Swift 2.2 (Xcode 7.3) ve sonraki sürümlerde (Swift 3 / Xcode 8 ve Swift 4 / Xcode 9 dahil):

İfadeyi Selectorkullanarak Swift işlev türünden bir yapı oluşturabilirsiniz #selector.

let timer = Timer(timeInterval: 1, target: object,
                  selector: #selector(MyClass.test),
                  userInfo: nil, repeats: false)
button.addTarget(object, action: #selector(MyClass.buttonTapped),
                 for: .touchUpInside)
view.perform(#selector(UIView.insertSubview(_:aboveSubview:)),
             with: button, with: otherButton)

Bu yaklaşımla ilgili en güzel şey nedir? Bir işlev başvurusu Swift derleyici tarafından denetlenir, böylece #selectorifadeyi yalnızca gerçekten var olan ve seçici olarak kullanılmaya uygun olan sınıf / yöntem çiftleriyle kullanabilirsiniz (aşağıdaki "Seçici kullanılabilirliği" bölümüne bakın). Ayrıca, işlev türü adlandırma için Swift 2.2+ kurallarına göre işlev başvurunuzu yalnızca ihtiyacınız olduğu kadar özel yapmakta özgürsünüz .

(Bu aslında ObjC @selector()yönergesine göre bir gelişmedir , çünkü derleyicinin -Wundeclared-selectorkontrolü yalnızca adlandırılmış seçicinin var olduğunu doğrular. #selectorVarlığını, bir sınıfa üyeliği ve tür imzasını kontrol etmek için ilettiğiniz Swift işlev başvurusu .)

İfadeye ilettiğiniz işlev referansları için birkaç ek uyarı vardır #selector:

  • Aynı taban adına sahip birden fazla işlev, işlev başvuruları için yukarıda belirtilen sözdizimi (örn. insertSubview(_:at:)Vs insertSubview(_:aboveSubview:)) kullanılarak parametre etiketleriyle ayırt edilebilir . Ancak bir işlevin parametresi yoksa, onu tanımlamanın tek yolu as, işlevin tür imzası olan bir döküm kullanmaktır (örn. foo as () -> ()Vs foo(_:)).
  • Swift 3.0 ve sonraki sürümlerde özellik alıcı / ayarlayıcı çiftleri için özel bir sözdizimi vardır. Örneğin a verildiğinde veya var foo: Intkullanabilirsiniz .#selector(getter: MyClass.foo)#selector(setter: MyClass.foo)

Genel Notlar:

Kılıflar #selectorçalışma ve isimlendirme değildir: Bazen (dinamik objc zamanında kayıtlı yöntemlerle, örneğin) bir seçici yapmak için bir işlev başvurusu yok. Bu durumda, Selectorbir dizeden a oluşturabilirsiniz: örneğin Selector("dynamicMethod:")- derleyicinin geçerlilik denetimini kaybedersiniz. Bunu yaptığınızda, :her parametre için iki nokta üst üste ( ) dahil olmak üzere ObjC adlandırma kurallarına uymanız gerekir .

Seçici kullanılabilirliği: Seçici tarafından başvurulan yöntem ObjC çalışma zamanına maruz bırakılmalıdır. Swift 4'te, ObjC'ye maruz kalan her yöntemin bildirimi @objcöznitelikle önceden yapılmalıdır . (Önceki sürümlerde bu özelliği bazı durumlarda ücretsiz olarak edindiniz, ancak şimdi açıkça beyan etmeniz gerekiyor.)

privateSembollerin çalışma zamanına da maruz kalmadığını unutmayın - yönteminizin en azından internalgörünürlüğe sahip olması gerekir .

Anahtar yollar: Bunlar seçicilerle ilgilidir, ancak seçicilerle tamamen aynı değildir. Swift 3'te bunlar için de özel bir sözdizimi var: örn chris.valueForKeyPath(#keyPath(Person.friends.firstName)). Ayrıntılar için SE-0062'ye bakınız. KeyPathSwift 4'te daha da fazla şey , bu yüzden uygunsa seçiciler yerine doğru KeyPath tabanlı API'yi kullandığınızdan emin olun.

Swift'i Kakao ve Objective-C ile Kullanma bölümünde Objective-C API'leriyle Etkileşim altında seçiciler hakkında daha fazla bilgi edinebilirsiniz .

Not: Swift Selector2.2'den önce, uygun olduğundan StringLiteralConvertible, çıplak dizelerin seçici alan API'lara aktarıldığı eski kodu bulabilirsiniz. Bunları kullanmak için Xcode'da "Geçerli Swift Sözdizimine Dönüştür" komutunu çalıştırmak istersiniz #selector.


8
İşlev adının çalıştığı bir dize koymak, NSSelectorFromString () de çalışır.
Arbitur

7
"Objective-C API'leri ile Etkileşim Kurmak" web sitesinde yer alırken, 'Hızlı Programlama Dili' kitabında DEĞİLDİR.

10
Bu muhtemelen bir argüman alırsa seçicinin sonunda bir ":" 'a ihtiyacı olduğunu belirtmelidir. (Örn. Test () -> "test" ve test (bu: Dize) -> "test:")
Daniel Schlaug

2
Ayrıca, Kakao çerçevelerinin bir Objective-C tarzı yöntem adı beklediğine dikkat edilmelidir. size:andShape:WithinitWithData:func init(Data data: NSData)
Metodunuz

6
"Seçici" yi bir dize olarak geçirme etrafında doğrulama eklemek için yine de var mı? IE derleyicisi, vb. Yanlış
yazdığımızda

86

SelectorSwift'te sınıfı nasıl kullanacağınıza dair kısa bir örnek :

override func viewDidLoad() {
    super.viewDidLoad()

    var rightButton = UIBarButtonItem(title: "Title", style: UIBarButtonItemStyle.Plain, target: self, action: Selector("method"))
    self.navigationItem.rightBarButtonItem = rightButton
}

func method() {
    // Something cool here   
}

Bir dize olarak iletilen yöntem işe yaramazsa, çalışma zamanında başarısız olur, zamanı derlemez ve uygulamanızı kilitler. Dikkatli ol


13
hangi korkunç ... "NSStringFromSelector" türü bir şey var mı?
Lena Bru

11

4
@malcomhall: @selectorkullanışlıdır, ancak düşündüğünüz kadar resmi olarak uygulanmaz. "Seçilmemiş seçici" yalnızca derleyiciden gelen bir uyarıdır, çünkü yeni seçiciler her zaman çalışma zamanında eklenebilir. Bununla birlikte , Swift'teki doğrulanabilir / yeniden düzenlenebilir seçici referansları yapmak için iyi bir özellik isteği olacaktır .
rickster

2
Bu cevap faydalıdır, ancak @objc ile aşağıdaki cevap daha uygundur.
cynistersix

Seçici dizesini bir değişken veya parametre olarak iletirken, derleyicinin Selector () işlevini kullanarak bir seçici olduğunu bildirmesi gerekir. teşekkürler
levous

46

Ayrıca, (Swift) sınıfınız Objective-C sınıfından almıyorsa, hedef yöntem adı dizesinin sonunda iki nokta üst üste işaretiniz olmalı ve @objc özelliğini hedef yönteminizle birlikte kullanmalısınız.

var rightButton = UIBarButtonItem(title: "Title", style: UIBarButtonItemStyle.Plain, target: self, action: Selector("method"))

@objc func method() {
    // Something cool here   
} 

aksi takdirde çalışma zamanında "Tanınmayan Seçici" hatası alırsınız.


3
1. iki nokta üst üste seçicileri bir argüman almalıdır 2. Apple belgelerine göre zamanlayıcının eylemleri NSTimer argümanı almalıdır 3. Selectoranahtar kelime zorunlu değildir. Yani bu durumda imza olmalı@objc func method(timer: NSTimer) {/*code*/}
Yevhen Dubinin

@objcbenim için çalıştı. Bunun timer: NSTimeriçin yöntem imzamı eklemem gerekmiyordu .
Mike Taverne

32

Swift 2.2+ ve Swift 3 Güncellemesi

Kullanımı #selectordaha az hataya açık hale getiren dize değişmezlerini kullanma ihtiyacını ortadan kaldıran yeni ifadeyi kullanın . Referans için:

Selector("keyboardDidHide:")

olur

#selector(keyboardDidHide(_:))

Ayrıca bakınız: Swift Evolution Proposal

Not (Swift 4.0):

Kullanıyorsanız #selector, işlevi şu şekilde işaretlemeniz gerekir:@objc

Misal:

@objc func something(_ sender: UIButton)


26

Swift 4.0

Seçiciyi aşağıdaki gibi oluşturursunuz.

1. etkinliği aşağıdaki gibi bir düğmeye ekleyin:

button.addTarget(self, action: #selector(clickedButton(sender:)), for: UIControlEvents.touchUpInside)

ve fonksiyon aşağıdaki gibi olacaktır:

@objc func clickedButton(sender: AnyObject) {

}

4
Daha @objcönce koymayı unuttun func, Swift 4'te gerekli.
Vahid Amiri

24

Gelecekteki okuyucular için, bir sorun yaşadığımı unrecognised selector sent to instanceve hedefi funcözel olarak işaretlemekten kaynaklanan bir hata aldığımı fark ettim .

func MUST bir seçici bir referans olan bir nesne çağrılacak genel olarak görünür.


13
o değil var yine özel bir yöntem tutmak ancak ekleyebilir herkese açık olmasını objc's ilanından önce. Örn: @objc private func foo() { ...o zaman istediğiniz "foo"kadar bir seçici olarak kullanabilirsiniz
apouche

Aynı zamanda internalherhangi bir erişim değiştirici belirtmeyebilir. Bu kalıbı sık sık kullanıyorum://MARK: - Selector Methods\n extension MyController {\n func buttonPressed(_ button: UIButton) {
Sajjon

19

NSTimer ile yaşadığım başka bir sorunun aynı sorunu olması durumunda, diğer cevapların hiçbirinin sorunu çözmediği, doğrudan veya derinden hiyerarşide NSObject'ten miras almayan bir sınıf kullanıyorsanız, ( örneğin manuel olarak oluşturulan hızlı dosyalar), diğer yanıtların hiçbiri aşağıdaki gibi belirtilse bile çalışmaz:

let timer = NSTimer(timeInterval: 1, target: self, selector: "test", 
                    userInfo: nil, repeats: false)
func test () {}

Sınıfı NSObject'ten miras almaktan başka bir şey değiştirmeden, "Tanınmayan seçici" Hatasını almayı bıraktım ve mantığımı beklendiği gibi çalıştırdım.


Bu alternatifle ilgili sorun, ViewController sınıfı uygulanmış öğelere (örn. ViewDidLoad ()) ihtiyaç duyduğunuz göz önüne alındığında, NSObject öğesinden devralmak için bir sınıfı (diyelim ki ViewController diyelim) değiştiremezsiniz. Herhangi bir fikir NSTimer kullanarak bir ViewController içinde Swift işlevini aramak için nasıl? ... e
eharo2

1
UIViewController zaten NSObject'ten miras alır, SDK tarafından maruz kalan çoğu sınıf bunu yapar, bu örnek NSTimer işlevselliği gerektiren kendi oluşturduğunuz sınıflar içindir ...
Martin Cazares

14

NSTimer'den işleve bir parametre iletmek istiyorsanız, işte çözümünüz:

var somethingToPass = "It worked"

let timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: "tester:", userInfo: somethingToPass, repeats: false)

func tester(timer: NSTimer)
{
    let theStringToPrint = timer.userInfo as String
    println(theStringToPrint)
}

Seçici metnine iki nokta üst üste ekleyin (testçi :) ve parametreleriniz userInfo'ya gider.

İşleviniz NSTimer'i parametre olarak almalıdır. Sonra sadece geçen parametreyi almak için userInfo ayıklayın.


3
NSTimer (0.01, target: self, ...) kullanmıyordu, oysa NSTimer.scheduledTimerWithTimeInterval (0.01, ..) kullanarak DID çalışması !? Garip ama cevap için @Scooter teşekkürler!
iOS-Coder

1
iOS-Coder sadece, oysa bir runloop eklemek gelmez Başlatıcı ile bir zamanlayıcı oluşturup @ scheduledTimerWith...otomatik olarak geçerli runloop ekler - bu yüzden hiç burada hiçbir garip davranışlar vardır;)
David Ganster

1
@ Öneriniz için teşekkürler. Sanırım yanlış anlama ya STFW ya da RTFA (Read The F ... ing API) kategorisine ait olmalı?
iOS-Coder

1
Endişelenmeyin, hiç kimsenin her API'daki her bir yöntemle ilgili belgeleri okuması beklenemez;)
David Ganster

10

Seçiciler, Objective-C'de bir yöntem adının dahili bir temsilidir. Objective-C "@selector (methodName)" kaynak kod yöntemi SEL veri türüne dönüştürür. Swift'te @selector sözdizimini kullanamayacağınız için (rickster orada bir noktadadır), yöntem adını doğrudan bir String nesnesi olarak veya Selector türüne bir String nesnesi ileterek manuel olarak belirtmeniz gerekir. İşte bir örnek:

var rightBarButton = UIBarButtonItem(
    title: "Logout", 
    style: UIBarButtonItemStyle.Plain, 
    target: self, 
    action:"logout"
)

veya

var rightBarButton = UIBarButtonItem(
    title: "Logout", 
    style: UIBarButtonItemStyle.Plain, 
    target: self, 
    action:Selector("logout")
)

8

Swift 4.1
Musluk hareketi örneği ile

let gestureRecognizer = UITapGestureRecognizer()
self.view.addGestureRecognizer(gestureRecognizer)
gestureRecognizer.addTarget(self, action: #selector(self.dismiss(completion:)))

// Use destination 'Class Name' directly, if you selector (function) is not in same class.
//gestureRecognizer.addTarget(self, action: #selector(DestinationClass.dismiss(completion:)))


@objc func dismiss(completion: (() -> Void)?) {
      self.dismiss(animated: true, completion: completion)
}

Daha fazla ayrıntı için Apple'ın belgesine bakın: Seçici İfadesi


Lütfen bunu yapmayı kes. Kimseye yardım etmez. Bunun Swift 3.1'den farkı nedir? Ve zaten yaklaşık 20 cevabı olduğunda buna başka bir cevap eklemenin neden gerekli olduğunu düşündünüz?
Fogmeister

arama seçicisi hızlı 4'te farklıdır. Bu cevapları hızlı 4'te deneyin ve bkz. Bunların hiçbiri düzenleme yapılmadan çalışmaz. Lütfen herhangi bir ifadeyi önemini sağlamadan spam olarak işaretlemeyin
Krunal

Mevcut, kabul edilen cevabı düzenlememeniz için herhangi bir sebep var mı? Bu, uzun bir cevap listesinin sonuna eklemek yerine gerçekten yararlı olacaktır. "Düzenle" düğmesi bir nedenden dolayı var.
Fogmeister

Ayrıca, bunun hangi kısmı Swift 3'ten farklı?
Fogmeister

2
Swift 4 için herhangi bir seçiciye objc etiketini eklemelisiniz. Bu doğru cevaptır. Ve anlamlarını değiştirmek için başkalarının cevaplarını düzenlememeniz gerekiyordu. @Krunal tamamen haklı.
Unome

6
// for swift 2.2
// version 1
buttton.addTarget(self, action: #selector(ViewController.tappedButton), forControlEvents: .TouchUpInside)
buttton.addTarget(self, action: #selector(ViewController.tappedButton2(_:)), forControlEvents: .TouchUpInside)

// version 2
buttton.addTarget(self, action: #selector(self.tappedButton), forControlEvents: .TouchUpInside)
buttton.addTarget(self, action: #selector(self.tappedButton2(_:)), forControlEvents: .TouchUpInside)

// version 3
buttton.addTarget(self, action: #selector(tappedButton), forControlEvents: .TouchUpInside)
buttton.addTarget(self, action: #selector(tappedButton2(_:)), forControlEvents: .TouchUpInside)

func tappedButton() {
  print("tapped")
}

func tappedButton2(sender: UIButton) {
  print("tapped 2")
}

// swift 3.x
button.addTarget(self, action: #selector(tappedButton(_:)), for: .touchUpInside)

func tappedButton(_ sender: UIButton) {
  // tapped
}

button.addTarget(self, action: #selector(tappedButton(_:_:)), for: .touchUpInside)

func tappedButton(_ sender: UIButton, _ event: UIEvent) {
  // tapped
}

Swift3 veya Swift4 için de iki veya üç argüman alan bir örnek olsaydı daha güzel ve daha eğitici olurdu. Teşekkürler.
nyxee

5
Create Refresh control using Selector method.   
    var refreshCntrl : UIRefreshControl!
    refreshCntrl = UIRefreshControl()
    refreshCntrl.tintColor = UIColor.whiteColor()
    refreshCntrl.attributedTitle = NSAttributedString(string: "Please Wait...")
    refreshCntrl.addTarget(self, action:"refreshControlValueChanged", forControlEvents: UIControlEvents.ValueChanged)
    atableView.addSubview(refreshCntrl)

// Yenileme Kontrol Yöntemi

func refreshControlValueChanged(){
    atableView.reloadData()
    refreshCntrl.endRefreshing()

}

5

Swift 3.0 yayınlandığından, bir hedef beyan etmek biraz daha incedir

class MyCustomView : UIView {

    func addTapGestureRecognizer() {

        // the "_" is important
        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(MyCustomView.handleTapGesture(_:)))
        tapGestureRecognizer.numberOfTapsRequired = 1
        addGestureRecognizer(tapGestureRecognizer)
    }

    // since Swift 3.0 this "_" in the method implementation is very important to 
    // let the selector understand the targetAction
    func handleTapGesture(_ tapGesture : UITapGestureRecognizer) {

        if tapGesture.state == .ended {
            print("TapGesture detected")
        }
    }
}

4

Kullanırken performSelector()

/addtarget()/NStimer.scheduledTimerWithInterval() yönteminiz (seçiciyle eşleşir) olarak işaretlenmelidir

@objc
For Swift 2.0:
    {  
        //...
        self.performSelector(“performMethod”, withObject: nil , afterDelay: 0.5)
        //...


    //...
    btnHome.addTarget(self, action: “buttonPressed:", forControlEvents: UIControlEvents.TouchUpInside)
    //...

    //...
     NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector : “timerMethod”, userInfo: nil, repeats: false)
    //...

}

@objc private func performMethod() {}
@objc private func buttonPressed(sender:UIButton){.
}
@objc private func timerMethod () {.
}

Swift 2.2 için, dize ve seçici adı yerine '#selector ()' yazmanız gerekir, böylece bundan dolayı yazım hatası ve çökme olasılığı artık olmayacaktır. Aşağıda örnek

self.performSelector(#selector(MyClass.performMethod), withObject: nil , afterDelay: 0.5)

3

Seçiciyi aşağıdaki gibi oluşturursunuz.
1.

UIBarButtonItem(
    title: "Some Title",
    style: UIBarButtonItemStyle.Done,
    target: self,
    action: "flatButtonPressed"
)

2.

flatButton.addTarget(self, action: "flatButtonPressed:", forControlEvents: UIControlEvents.TouchUpInside)

@Selector sözdiziminin gittiğini ve çağrılacak yöntemi adlandıran basit bir Dize ile değiştirildiğini unutmayın. Hepimizin ayrıntılara engel olduğu bir alan var. Tabii ki, flatButtonPressed adlı bir hedef yöntem olduğunu beyan ettiysek: bir tane yazsak iyi olur:

func flatButtonPressed(sender: AnyObject) {
  NSLog("flatButtonPressed")
}

zamanlayıcıyı ayarlayın:

    var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, 
                    target: self, 
                    selector: Selector("flatButtonPressed"), 
                    userInfo: userInfo, 
                    repeats: true)
    let mainLoop = NSRunLoop.mainRunLoop()  //1
    mainLoop.addTimer(timer, forMode: NSDefaultRunLoopMode) //2 this two line is optinal

Tamamlamak için, burada flatButtonPressed

func flatButtonPressed(timer: NSTimer) {
}

" @Selector sözdiziminin kaybolduğunu unutmayın " için herhangi bir kaynağınız var mı?
winklerrr

3

Bu cevapların birçoğunun yararlı olduğunu gördüm, ancak bunun düğme olmayan bir şeyle nasıl yapılacağı net değildi. Hızlı bir şekilde bir UILabel'a bir jest tanıyıcı ekliyordum ve mücadele ettim, bu yüzden yukarıdaki her şeyi okuduktan sonra benim için çalıştığını buldum:

let tapRecognizer = UITapGestureRecognizer(
            target: self,
            action: "labelTapped:")

"Seçici" şu şekilde beyan edildi:

func labelTapped(sender: UILabel) { }

Herkese açık olduğunu ve Selector () sözdizimini kullanmıyorum ancak bunu da yapmak mümkün olduğunu unutmayın.

let tapRecognizer = UITapGestureRecognizer(
            target: self,
            action: Selector("labelTapped:"))

3

#Selector kullanmak , aramak istediğiniz yöntemin gerçekten var olduğundan emin olmak için derleme zamanında kodunuzu kontrol eder. Daha da iyisi, yöntem yoksa, bir derleme hatası alırsınız: Xcode, uygulamanızı oluşturmayı reddeder ve böylece başka bir olası hata kaynağını ortadan kaldırmak için yasaklar.

override func viewDidLoad() {
        super.viewDidLoad()

        navigationItem.rightBarButtonItem =
            UIBarButtonItem(barButtonSystemItem: .Add, target: self,
                            action: #selector(addNewFireflyRefernce))
    }

    func addNewFireflyReference() {
        gratuitousReferences.append("Curse your sudden but inevitable betrayal!")
    }

2

Eylemi tetikleyen kontrolü nerede ayarladığınızı not etmek yararlı olabilir.

Örneğin, bir UIBarButtonItem kurarken, viewDidLoad içinde düğme oluşturmak zorunda kaldım veya başka bir tanınmayan seçici istisna alırsınız bulduk.

override func viewDidLoad() {
    super.viewDidLoad() 

    // add button
    let addButton = UIBarButtonItem(image: UIImage(named: "746-plus-circle.png"), style: UIBarButtonItemStyle.Plain, target: self, action: Selector("addAction:"))
    self.navigationItem.rightBarButtonItem = addButton
}

func addAction(send: AnyObject?) {     
    NSLog("addAction")
}

1

Seçici sözdizimini çağıran yöntemde basit bir dize adlandırma olarak değiştirme

var timer1 : NSTimer? = nil
timer1= NSTimer(timeInterval: 0.1, target: self, selector: Selector("test"), userInfo: nil, repeats: true)

Bundan sonra, func test () yazın.


1

selectorBir kelime Objective-Cdünya ve sen onu kullanabilirler Swiftaramak için bir olasılık var Objective-CdanSwift Size zamanında bazı kod yürütmesine olanak

Swift 2.2Sözdizimi olmadan önce :

Selector("foo:")

Bir işlev adı SelectorString parametresi ("foo") olarak aktarıldığından, bir adın derleme zamanında kontrol edilmesi mümkün değildir . Sonuç olarak sen yapabilirsiniz bir çalışma zamanı hatası alıyorum:

unrecognized selector sent to instance

Swift 2.2+Sözdiziminden sonra :

#selector(foo(_:))

Xcode'un otomatik tamamlama yöntemi doğru yöntemi aramanıza yardımcı olur


0

Swift 3 için

// Zamanlayıcı oluşturmak için örnek kod

Timer.scheduledTimer(timeInterval: 1, target: self, selector: (#selector(updateTimer)), userInfo: nil, repeats: true)

WHERE
timeInterval:- Interval in which timer should fire like 1s, 10s, 100s etc. [Its value is in secs]
target:- function which pointed to class. So here I am pointing to current class.
selector:- function that will execute when timer fires.

func updateTimer(){
    //Implemetation 
} 

repeats:- true/false specifies that timer should call again n again.

0

Swift 4'teki seçici:

button.addTarget(self, action: #selector(buttonTapped(sender:)), for: UIControlEvents.touchUpInside)

-1

Hızlı 3 için

let timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(self.test), userInfo: nil, repeats: true)

İşlev bildirimi Aynı sınıfta:

@objc func test()
{
    // my function
} 

Hedef kendilikse, selfseçicide olması gerekmez . Bu yeterli olmalı:let timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(test), userInfo: nil, repeats: true)
Mithra Singam
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.