2017-08-15 11 views
1

新しいテキストに合わせてサイズを変更できるように、UILabelでテキストが変更されるたびに通知を受けようとしています。UILabelでAddObserverが動作しない

public class MessageContainer : UILabel 
{ 
    private readonly int _width; 

    public MessageContainer(int width) 
    { 
     _width = width; 
     TextAlignment = UITextAlignment.Center; 
     Font = UIFont.PreferredTitle1; 
     TextColor = UIColor.White; 
     Lines = 999; 

     this.AddObserver("text", Foundation.NSKeyValueObservingOptions.Initial | Foundation.NSKeyValueObservingOptions.New, TextChanged); 
    } 

    private void TextChanged(Foundation.NSObservedChange change) 
    { 
     var s = change.NewValue as Foundation.NSString; 

     if (s != null) // s is always null here 
     { 
      var size = s.StringSize(UIFont.PreferredTitle1, new CGSize(_width - 20, 999), UILineBreakMode.CharacterWrap); 
      this.ResizeFrame(size.Width, size.Height); 
     } 
    } 
} 

マイTextChanged関数が呼び出されますが、change.NewValueは常にnullである:ここに私のコードです。私はXamarin.iOSを使用していますが、答えはObjective-CやSwiftでも同じです。

答えて

2

はここでテキストが変更されたとき、あなたを伝えるために、デリゲートを持つUILabelのための簡単なサブクラスです。

+0

これは機能しました。私はプロパティを無効にすることができるかどうかわからなかった! – Darius

1

これにはキー値観測は使用できません。代わりに、UILabelをサブクラス化し、テキストがいつ設定されるかを検出する必要があります。

は、ラベルのテキストがいつ変更されるのかを知っているので、あなたはこれが必要だと少し驚いていますか?唯一の方法はに変更されていることです。さらに、UILabelは自動レイアウトの下で自動的にサイズ変更されるため、問題の原因がわかりにくいです。それはあなたがそれを望むように「ちょうどうまくいく」。それはテストされていないので、

class MyLabel: UILabel { 
    var delegate: MyLabelDelegate? 
    override var text: String { 
     willSet(string) { 
      delegate?.willSet(self, text: string) 
     } 
    } 
} 

protocol MyLabelDelegate { 
    func willSet(_ label: MyLabel, text: String) 
} 

私は自分の携帯電話上でこれをしなかったが、それは動作するはずです:

+0

私はMvvmCrossを使用しています。テキストを変更するコードはiOSプロジェクトでさえありません。 UILabelはUITableViewのセルにあります。 UILabelをプログラムで(私はストーリーボードは使用しません)ビューに追加しましたが、それは自己サイズ変更しません...自己サイズ変更を行う方法はありますか? – Darius

+0

自動レイアウト制約を使用して配置すると、自動的にサイズ変更されます。それ以外の場合は 'sizeToFit'を送るだけです。いずれにしても、あなたはこれを過度に考えている(私は思う)。 – matt

関連する問題