2015-10-06 4 views
6

У меня возникла проблема с некоторыми сбоями в iOS с подклассом UILabel. Теперь я хотел бы переопределить setText:, чтобы позвонить layoutIfNeeded, так как это может решить проблему в соответствии с некоторыми ответами stackoverflow (e.g. this one).переопределить UILabel setText: метод в Swift

Но как я могу это достичь? В Objective-C это было неважно, но я не нашел способ переопределить setText: в Swift.

+0

Если мой ответ решить вашу проблему, пожалуйста, нажмите на флажок рядом с ним, чтобы принять его. Если нет, уточните вашу проблему. – vacawama

ответ

9

Override свойство text и предоставить код в didSet, которые будут выполнены, когда свойство text установлено:

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

Правильный ответ здесь. Ударьте меня на минутку. :) –

+0

не уверен, почему это не работает внутри наконечника. Hmmmm ... –

+0

@DanRosenstark, вы изменили свой uilabel на обычную uilabel как на построителе интерфейса, так и на быстром классе. С помощью этого способа я могу переопределить метод набора текста. – mkeremkeskin

3

Я вытащил Метода Swizzling в Swift 2.0. За верхом метод setText UILabel.

Скопируйте код в приложение делегата и использовать customSetText, чтобы уровень приложений изменяет

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