2014-09-24 7 views
11

A UIView einen Warnhinweis in Abhängigkeit von der Beendigung Handler von einem benutzerdefinierten Steuerelement ändern muss:Nested Verschlüsse nicht wie Argumentliste

voucherInputView.completionHandler = {[weak self] (success: Bool) -> Void in 

     self?.proceedButton.enabled = success 
     self?.warningLabel.alpha = 1.0 

     if success 
     { 
      self?.warningLabel.text = "Code you entered is correct" 
      self?.warningLabel.backgroundColor = UIColor.greenColor() 
     } 
     else 
     { 
      self?.warningLabel.text = "Code you entered is incorrect" 
      self?.warningLabel.backgroundColor = UIColor.orangeColor() 
     } 


     UIView.animateWithDuration(NSTimeInterval(1.0), animations:{()-> Void in 
      self?.warningLabel.alpha = 1.0 
     }) 

Der letzte Animationsblock einen Fehler in der Form zeigt.

Cannot invoke 'animateWithDuration' with an argument list of type '(NSTimeInterval), animations:()-> Void)' 

Wenn ich dies irgendwo außerhalb der Abschlussschließung nennen, funktioniert es.

Antwort

39

Das Problem ist, dass die Schließung implizit das Ergebnis dieses Ausdrucks zurückgibt:

self?.warningLabel.alpha = 1.0 

aber der Verschluss selbst wird als Rückkehr Void erklärt.

eine explizite return Hinzufügen sollte das Problem beheben:

UIView.animateWithDuration(NSTimeInterval(1.0), animations: {()-> Void in 
    self?.warningLabel.alpha = 1.0 
    return 
}) 
+0

vielen dank =) !! –

+5

Das hat es für mich repariert, aber würde jemand etwas dagegen haben zu erklären * warum * dieses Verhalten ist so seltsam und unerwartet für viele Leute? BTW, in Ihrem Beispiel können Sie '() -> Void' durch '_' ersetzen und Return mit' 'anhängen; zurück in die gleiche Zeile. AUCH können Sie schreiben ';() 'anstelle einer einzeiligen' return'. :) – BastiBen

+0

Das ist die richtige Antwort !!! –

0

Antonio Lösung gilt auch mit verschachtelten Verschlüsse, wie innerhalb UITableViewRowAction Handler eine AFNetworking Anfrage zu tun.

override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [AnyObject]? { 

    let cleanRowAction = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "Do Stuff", handler: {[weak self](action: UITableViewRowAction!, indexPath: NSIndexPath!) in 

     AFHTTPSessionManager(baseURL: NSURL(string: "http://baseurl")).PUT("/api/", parameters: nil, success: { (task: NSURLSessionDataTask!, response: AnyObject!) -> Void in 

       // Handle success 

       self?.endEditing() 
       return 
      }, failure: { (task: NSURLSessionDataTask!, error: NSError!) -> Void in 

       // Handle error 

       self?.endEditing() 
       return 
     }) 
     return 

    }) 

    cleanRowAction.backgroundColor = UIColor.greenColor() 
    return [cleanRowAction] 
}