2017-08-15 122 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始終爲空。我正在使用Xamarin.iOS,但我確定在Objective-C或Swift中的答案是一樣的。

回答

2

下面是一個簡單的子類的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

這工作。我甚至不知道我可以重寫屬性! – Darius

1

你不能使用鍵值觀察;相反,您需要繼承UILabel並檢測文本何時設置。

但是,我有點驚訝,你認爲你需要這個,因爲你怎麼能不是知道標籤的文本何時改變?唯一可能發生的是改變了。而且,UILabel在自動佈局下自動調整大小,所以很難看出問題應該是什麼。它「按照你想要的方式工作」。

+0

我正在使用MvvmCross,更改文本的代碼甚至不在iOS項目中。 UILabel位於UITableView的單元格中。 我以編程的方式將UILabel添加到視圖中(我不使用故事板),它不會自動調整大小......有沒有辦法讓它自動調整大小? – Darius

+0

如果您使用自動佈局約束來定位它,它將自動調整大小。否則,只需發送'sizeToFit'。無論哪種方式,你都是這樣想的(我認爲)。 – matt