Swift

2016-04-06 31 views
1

için bir genel tamamlama işleyicisi oluşturma Yeni bir proje için oluşturduğum genel bir NSObject animasyon sınıfım var ve bazı eski projeleri yeni sınıfla yeniden düzenlemeyi deniyorum. Görünüm kontrollerimden gereksiz miktarda gereksiz kodları kaldırmak için planımı attıran, tamamlama blokları içeren animasyonlar bulana kadar her şey yolundaydı. İşte Doğrusu bir düğme animasyon uygulamak için tüm şeyler yazmak yerine, onu kullanmak için ...Swift

Animator.swift

class Animator: NSObject { 
    var control: UIControl? // Can accept everything that's a subclass of UIControl 

    override init() { 
     super.init() 
    } 

    // FIXME: figure out how to add a completion block as a parameter on a method call 
    func animateControl(control: UIControl) { 
     control.transform = CGAffineTransformMakeScale(0.75, 0.75) 
     UIView.animateWithDuration(0.5, 
            delay: 0, 
            usingSpringWithDamping: 0.3, 
            initialSpringVelocity: 5.0, 
            options: UIViewAnimationOptions.AllowUserInteraction, 
            animations: { 
            control.transform = CGAffineTransformIdentity 
     }) { (value: Bool) -> Void in 
      // completion block 
      // ** method as a parameter goes here? ** 
     } 
    } 
} 

bu var, ben sadece MyViewController.swift

gelen sınıf çağrı

// Property declaration 
let animator = Animator() 

// Tie it to an IBAction 
@IBAction func myButtonAction(sender: UIButton) { 
    animator.animateControl(sender, methodIWantToRunAfterAnimateControlFinishes) 
} 

func methodIWantToRunAfterAnimateControlFinishes() { 
    // Do Stuff 
} 

nasılbesleyecek

MyViewController.swift'un başlatıcısı bir tamamlama bloğu olarak çalışmak için bir yöntem mi? this'a baktım (web sitem değil, ama nasıl hissediyorum), ama işe yaramayacağım.

Güncelleme

Ben sözdizimi ile biraz güreşmek zorunda kaldı, ama burada bitiş çizgisine üzerinde beni başlatıcı kod:

func animateControl(control: UIControl, completion: (() -> Void)?) { 
    control.transform = CGAffineTransformMakeScale(0.75, 0.75) 
    UIView.animateWithDuration(0.5, 
           delay: 0, 
           usingSpringWithDamping: 0.3, 
           initialSpringVelocity: 5.0, 
           options: UIViewAnimationOptions.AllowUserInteraction, 
           animations: { 
           control.transform = CGAffineTransformIdentity 
    }) { _ in 
     // completion block 
     completion?() 
    } 
} 

Bu/kod ve w tamamlama blokları kolları nil tamamlama blokları.

cevap

3

parametre olarak kullanılan bir çok basit tamamlama bloğu şuna benzer: () -> Void? null neden

onCompletion: (() -> Void)? 

nedeni Objective-C kullanılabilecek olmaktır. Bu gerekli değilse, parantez içine almak veya null ? olarak işaretlemek gerekmez.

Bu, hiçbir parametre beklemeyen ve hiçbir şey döndürmeyen bir işlevi iletmenize izin verir. Bunun parametreleri eklemek istiyorsanız,

func animateControl(control: UIControl, onCompletion: (() -> Void)?) 

tamamlama bloğunun imza içine ekleyin: Sen şöyle imzanıza eklersiniz

func animateControl(control: UIControl, onCompletion: ((value: AnyObject) -> Void)?) 

aynı dönüş deyimi için de geçerli :

func animateControl(control: UIControl, onCompletion: ((value: AnyObject) -> AnyObject)?) 

sizin işlevin imzası tamamlandıktan sonra, o en adıyla diyebilirsiniz:

func animateControl(control: UIControl, onCompletion: ((value: AnyObject) -> Void)?) { 
    //do stuff here 
    onCompletion(obj) 
} 
+0

Bu konuda bana meydan okuduğunuz için teşekkür ederim. Oldukça memnun olarak. – Adrian

1

Böyle bir tamamlama işleyicisi ekleyebilir ve örneğinizde olduğu gibi onu çağırabilirsiniz.

func animateControl(control: UIControl, _ completion: (() ->())? = nil) { 
    control.transform = CGAffineTransformMakeScale(0.75, 0.75) 
    UIView.animateWithDuration(0.5, 
           delay: 0, 
           usingSpringWithDamping: 0.3, 
           initialSpringVelocity: 5.0, 
           options: UIViewAnimationOptions.AllowUserInteraction, 
           animations: { 
           control.transform = CGAffineTransformIdentity 
    }) { _ in 
     completion?() 
    } 
} 
+0

Bu konuda yardımlarınız için teşekkür ederiz! Çok takdir ediyorum. – Adrian