ios - UILabel 上的 AddObserver 不起作用

标签 ios xamarin.ios

每当我的 UILabel 中的文本发生更改时,我都会尝试获取通知,以便我可以调整它的大小以适应新文本。这是我的代码:

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 中是相同的。

最佳答案

这是 UILabel 的一个简单子(monad)类,它带有一个委托(delegate)来告诉您文本何时更改:

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

我在手机上做了这个,所以它没有经过测试,但它应该可以工作。

关于ios - UILabel 上的 AddObserver 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45696605/

相关文章:

ios - 如果当前显示智能横幅应用程序,如何在 javascript 中检测?

c# - Xamarin:libmonosgen-2.0.dylib:MCNearbyServiceAdvertiser 上缺少所需的代码签名

ios - UITableView 拖动结束

iphone - 在 iPhone/iPad 项目中处理 WCF

ios - 如何获取 Google Maps API iOS 中某个点的坐标?

ios - 在 -shouldAutorotateToInterfaceOrientation : 中预测 UI 元素框架

ios - 枚举我的 iOS 应用程序中的所有钥匙串(keychain)项目

ios - 加快游戏中所有 Sprite 的速度

ios - 何时使用 MKMapView 的 MKUserTrackingMode vs 位置管理器的开始更新位置?

ios - 在没有 iOS 设备的情况下生成我的 Xamarin 应用程序的 IPA 文件