2017-08-15 1 views
1

Ich versuche Benachrichtigungen zu erhalten, wenn sich der Text in meinem UILabel ändert, so dass ich die Größe ändern kann, um den neuen Text anzupassen. Hier ist mein Code:AddObserver auf UILabel funktioniert nicht

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

Meine TextChanged Funktion aufgerufen wird, aber change.NewValue ist immer null. Ich benutze Xamarin.iOS, aber ich bin mir sicher, dass die Antwort in Objective-C oder Swift die gleiche ist.

Antwort

2

Hier ist eine einfache Unterklasse für UILabel mit einem Delegierten, Ihnen zu sagen, wenn der Text ändert:

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

ich das auf meinem Handy habe, so ist es nicht getestet, aber es sollte funktionieren.

+0

Das hat funktioniert. Ich wusste nicht einmal, dass ich Eigenschaften übersteuern kann! – Darius

1

Sie können die Schlüsselwertbeobachtung nicht verwenden; stattdessen müssten Sie UILabel ableiten und erkennen, wenn der Text gesetzt ist.

Allerdings bin ich ein wenig überrascht, dass Sie denken, dass Sie das brauchen, denn wie können Sie nicht wissen, wenn der Text eines Labels ändert? Die einzige Möglichkeit, die passieren kann, ist, dass Sie geändert haben. Darüber hinaus nimmt UILabel die automatische Größenanpassung bei der automatischen Layout-Erstellung vor, so dass es schwierig ist, das Problem zu erkennen. Es funktioniert einfach so, wie Sie es wollen.

+0

Ich benutze MvvmCross, der Code, der den Text ändert, ist nicht einmal im iOS-Projekt. Und das UILabel ist in einer Zelle eines UITableView. Ich habe die UILabel der Ansicht programmgesteuert hinzugefügt (ich verwende keine Storyboards) und die Größe wird nicht automatisch angepasst ... gibt es eine Möglichkeit, die Größe zu ändern? – Darius

+0

Wenn Sie es mithilfe von automatischen Layoutbeschränkungen positionieren, wird die Größe automatisch angepasst. Ansonsten sende einfach 'sizeToFit' an sie. So oder so, du denkst das (denke ich) über. – matt

Verwandte Themen