2015-10-06 39 views
6

UILabel alt sınıfında iOS'ta bazı kilitlenme sorunum var. Şimdi, layoutIfNeeded numaralı telefonu aramak için setText:'u geçersiz kılmak istiyorum çünkü bu, bazı stackoverflow-yanıtlarına (e.g. this one) göre sorunu çözebilir.UILabel setText değerini geçersiz kıl: Swift içinde yöntem

Ancak bunu nasıl başarabilirim? Objective-C'de büyük bir anlaşma yoktu, ancak Swift'de setText:'u geçersiz kılmanın bir yolunu bulamıyorum.

+0

değiştirir. Değilse, lütfen sorununuzu açıklayın. – vacawama

cevap

9
özelliği text geçersiz kıl ve text özelliği ayarlandığında yürütülen alacak didSet kod sağlamak

: Ben Swift 2.0 Yöntem Swizzling çekti

class MyLabel: UILabel { 
    override public var text: String? { 
     didSet { 
      layoutIfNeeded() 
     } 
    } 
} 
+0

Doğru cevap burada. Beni bir dakikalığına bitir. :) –

+0

neden bu bir ucu içinde çalışmıyorsa emin değilim. Hmmmm ... –

+0

@DanRosenstark UID'nizi her iki arayüz oluşturucuda ve hızlı sınıfta özel uilabel olarak değiştirdiniz. Bu şekilde ayarlanmış metin yöntemini geçersiz kılabilirim. – mkeremkeskin

3

. UILabel'ın setText yöntemini kullanmaktan fazlası.

Kopya uygulaması temsilci kod ve uygulama düzeyini yapmak için customSetText kullanmak cevabım sorununuzu çözdü Eğer bunu kabul etmek için yanında, onay işareti tıklayınız

// MARK: - Method Swizzling 

extension UILabel { 
    public override class func initialize() { 
     struct Static { 
      static var token: dispatch_once_t = 0 
     } 

     // make sure this isn't a subclass 
     if self !== UILabel.self { 
      return 
     } 

     dispatch_once(&Static.token) { 
      let originalSelector = Selector("setText:") 
      let swizzledSelector = Selector("customSetText:") 

      let originalMethod = class_getInstanceMethod(self, originalSelector) 
      let swizzledMethod = class_getInstanceMethod(self, swizzledSelector) 

      let didAddMethod = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)) 

      if didAddMethod { 
       class_replaceMethod(self, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)) 
      } else { 
       method_exchangeImplementations(originalMethod, swizzledMethod) 
      } 
     } 
    } 

    // MARK: - Custom set text method for UI Label 

    func customSetText(text: String) { 
     self.customSetText(text) 
     //set custom font to all the labels maintaining the size UILabel 
     self.font = UIFont(name: "Lato-LightItalic", size: self.font.pointSize) 
    } 
}