2015-10-06 15 views
6

UILabelサブクラスを使用してiOSでクラッシュするという問題があります。今度はを無効にしてlayoutIfNeededを呼び出すと、stackoverflow-answers(e.g. this one)の問題が解決する可能性があります。UILabel setText:method in Swift

しかし、これをどのように達成できますか? Objective-Cでは大したことではありませんでしたが、SwiftではsetText:を無効にする方法はありません。

+0

を変更するためにcustomSetTextを使用しています。そうでない場合は、問題を明確にしてください。 – vacawama

答えて

9
プロパティ textをオーバーライドし textプロパティが設定されているときに実行されます didSetのコード提供

:私はスイフト2.0のメソッドスウィズリングを引っ張る

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

ここで正解です。 1分ほどで私を打つ。 :) –

+0

これがペン先の中でうまくいかない理由がわからない。うーん... –

+0

@DanRosenstarkインターフェースビルダーと迅速なクラスの両方で、あなたのuilabelをカスタムuilabelに変更しましたか?このようにして、set textメソッドをオーバーライドすることができます。 – mkeremkeskin

3

を。オーバーライドUILabelのsetTextメソッド。

コピーアプリデリゲートのコードとアプリケーションレベルが私の答えはあなたの問題を解決した場合は、それを受け入れることを横にチェックマークをクリックしてください

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