2017-08-15 63 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