2015-10-06 51 views
6

我確實遇到了一個問題,我在iOS中遇到了一些與UILabel子類有關的崩潰問題。現在我想覆蓋setText:致電layoutIfNeeded,因爲這可能會解決問題根據一些stackoverflow答案(e.g. this one)。重寫UILabel setText:在Swift中的方法

但我該如何做到這一點?在Objective-C中沒有什麼大不了的,但我沒有找到在Swift中重寫setText:的方法。

+0

如果我的回答解決您的問題,請點擊勾選旁邊接受它。如果沒有,請澄清你的問題。 – vacawama

回答

9

重寫屬性text,並提供didSet代碼時text屬性設置將得到執行:

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

正確的答案在這裏。打我一分鐘。 :) –

+0

不知道爲什麼這不是在一個筆尖內工作。嗯...... –

+0

@DanRosenstark你是否在界面生成器和Swift類上將你的uilabel變成了自定義的uilabel。通過這種方式,我可以覆蓋設置的文本方法。 – mkeremkeskin

3

我的雨燕2.0拉法混寫的。使用UILabel的setText方法。

拷貝到應用程序委託的代碼,並使用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) 
    } 
}