2015-10-06 18 views
6

Ho il problema che ho avuto alcuni arresti anomali in iOS con una sottoclasse UILabel. Ora desidero ignorare setText: per chiamare layoutIfNeeded in quanto ciò potrebbe risolvere il problema in base ad alcune risposte stackoverflow (e.g. this one).override UILabel setText: metodo in Swift

Ma come posso ottenere questo? In Objective-C non era un grosso problema, ma non trovo il modo di ignorare lo setText: in Swift.

+0

Se la mia risposta ha risolto il problema, fai clic sul segno di spunta accanto ad essa accettarlo. In caso contrario, chiarire il problema. – vacawama

risposta

9

sovrascrivere la proprietà text e fornire il codice in didSet che andranno eseguiti quando la proprietà è impostata text:

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

Risposta corretta qui. Batti a questo di un minuto. :) –

+0

non so perché questo non funziona all'interno di un pennino. Hmmmm ... –

+0

@DanRosenstark hai cambiato il tuo uilabel in uilabel personalizzato sia sul builder dell'interfaccia che sulla classe swift. In questo modo posso sovrascrivere il metodo di testo impostato. – mkeremkeskin

3

ho tirato del metodo Swizzling a Swift 2.0. Superando il metodo setText di UILabel.

Copia il codice di applicazione delegato e utilizzare il customSetText per fare a livello di applicazione cambia

// 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) 
    } 
}