2014-10-13 13 views
8
@IBAction func getNewPhotoAction(sender: AnyObject) { 
    println("getNewPhotoAction") 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.getNewPhotoAction(sender: AnyObject) // Error 
} 

voglio solo chiamare il metodo IBAction getNewPhotoAction in viewDidLoad.Swift - chiamare @IBAction metodo viewDidLoad senza parametro

Quale parametro immettere in questa riga ->self.getNewPhotoAction(?????)?

Non ho alcun parametro. Devo solo chiamare.

ho usato in stile Objective-C:

[self getNewPhotoAction:nil] 

ma non so stile Swift.

+0

Passo sé come ANYOBJECT cioè self.getNewPhotoAction (auto) –

+0

@ himanshu-Padia Non aggiungere blockquotes per cose che non sono il codice. E se modifichi, non dimenticare di mettere correttamente in maiuscolo i nomi e correggere gli errori. La modifica per aggiungere il nome della lingua in blockquotes non è accettabile. Grazie. – Moritz

risposta

0

Poiché non si dispone di alcun mittente, consegnare nil.

self.getNewPhotoAction(nil) 
+0

'La firma di getNewPhotoAction dovrà essere cambiata in' AnyObject? 'Se si vuole passare nil. –

+1

self.getNewPhotoAction (nil) -> Ho già provato ma è l'errore – user1272854

3

Si può sempre creare un func separato che si chiama nel vostro viewDidLoad o nel vostro IBAction

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.getNewPhoto() 
} 

func getNewPhoto(){ 
    //do whatever you want here. 
    println("getnewphotoaction") 
    println("whatever you want") 
} 
@IBAction func getNewPhotoAction(sender: AnyObject) { 
    self.getNewPhoto() 
} 
+0

sì .. è una buona soluzione. ma voglio chiamare il metodo diretto ..comunque grazie la tua risposta – user1272854

+0

Questo aggiunge una piccola quantità, anche se non necessaria, di massa al codice. – Airuop

+1

@ La soluzione di Amazon è migliore. Introduce un'astrazione intermedia e comprensibile. Ma se vuoi davvero chiamarlo direttamente, controlla la mia risposta. –

28

Il parametro sender indica che stanno chiamando il metodo di azione. Quando si chiama da viewDidLoad, basta passare a self.

override func viewDidLoad() { 
    super.viewDidLoad() 
    getNewPhotoAction(self) 
} 

proposito, se il parametro sender del metodo getNewPhotoAction non è stato utilizzato, il nome del parametro può essere omesso.

@IBAction func getNewPhotoAction(AnyObject) { 
    println("getNewPhotoAction") 
} 
2

In realtà non c'è bisogno di passare any object a tutti. Se avete bisogno di utilizzare il sender, poi dichiarare la function senza di essa in questo modo:

@IBAction func getNewPhotoAction() { ... } 

e usarlo in questo modo:

self.getNewPhotoAction() 

Potrebbe essere necessario ri-collegare l'uscita in interface builder quando apporti questa modifica (rimuovila e aggiungila di nuovo) se questo metodo è collegato a un evento in interface builder.

+1

Il 99% delle ibactions non ha alcuna utilità per il mittente. Questo funziona entrambi attorno al problema di maneggevolezza che è andato storto in xcode 8 e rende il codice più compatto. grazie! –

0

Se hai ancora bisogno di fare riferimento alla UIButton o qualsiasi altra cosa sta inviando l'azione e vuole chiamare dal codice allo stesso tempo - si può fare anche questo:

onNext(UIButton())

uno spreco, ma meno codice .

1
@IBAction func getNewPhotoAction(sender: AnyObject? = nil) { 
    print("getNewPhotoAction") 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.getNewPhotoAction(nil) 
} 
2
@IBAction func getNewPhotoAction(sender: AnyObject?){ 
    ...... 
} 

**AnyObject** means that you have to pass kind of Object which you are using, nil is not a AnyObject. 
But **AnyObject?**, that is to say AnyObject is Optional, nil is a valid value. 
meaning the absence of a object. 

self .getNewPhotoAction(nil) 
+0

Funziona davvero. –

Problemi correlati