2015-01-22 21 views
8

Mam podklasę o nazwie UIView o nazwie MyView, którą tworzę.Korzystanie z IBDesignable i prepareForInterfaceBuilder z UILabelem

Jest w nim UILabel (kod ten nie jest dodawany w InterfaceBuilder z powodów).

Mam nieruchomość pod numerem MyView o nazwie color.

Chciałbym, aby Konstruktor interfejsów mógł wybrać color, a następnie wyświetlić etykietę z zestawem czcionek dla tego koloru.

W moim kodu mam ...

@IBDesignable class MyView: UIView { 

    private let textLabel = UILabel() 

    @IBInspectable var color: UIColor = .blackColor() { 
     didSet { 
      textLabel.textColor = color 
     } 
    } 

    required init(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 

     initialSetup() 
    } 

    override init(frame: CGRect) { 
     super.init(frame: frame) 

     initialSetup() 
    } 

    private func initialSetup() -> Void { 
     self.backgroundColor = .clearColor() 

     textLabel.textAlignment = .Center 
     textLabel.numberOfLines = 0 

     addSubview(textLabel) 
    } 

    override func layoutSubviews() { 
     super.layoutSubviews() 

     textLabel.frame = bounds 
    } 

    // I have no idea what I'm doing here?! 
    override func prepareForInterfaceBuilder() { 
     // should I create a label specifically for here? 
     // or should I use the property textLabel? 

     textLabel.text = "Hello, world!" // setting place holder IB text? 
     textLabel.textColor = color 
     textLabel.font = .systemFontOfSize(21) 
     textLabel.textAlignment = .Center 
     textLabel.numberOfLines = 0 

     // do I need to add sub view? 
    } 

} 

IBInspectable

W IB widzę właściwość color tam i mogę go ustawić. Irytowanie przyjmuje domyślną wartość .clearColor(), ale nie jest to kolor ustawiony w kodzie. Czy istnieje sposób, aby to naprawić?

IBDesignable

Kiedy kładę wgląd InterfaceBuilder pokazuje wszystkie właściwości podlegającej inspekcji, ale nic nie jest pokazany w rzeczywistym widoku.

Po uruchomieniu wszystko działa poprawnie. Chciałbym móc uzyskać coś działającego (poza drawRect) w IB. Zauważam jednak wyraźny brak dokumentacji.

Edycja - Ostrzeżenia

Właśnie zauważyłem, że jestem coraz zbudować błędy/ostrzeżenia mówiąc ...

ostrzeżenie: IB Designables: Zignorowanie zdefiniowany przez użytkownika atrybut kluczowy dla wykonania ścieżki „color "na przykład z" UIView ". Wystąpił wyjątek podczas próby ustawienia jego wartości: [setValue: forUndefinedKey:]: ta klasa nie jest zgodna z kodowaniem kluczem kluczowym dla koloru klucza.

ta prawdopodobnie ulegnie zmianie rozwiązanie :)

Odpowiedz

2

skopiowane kod z pytaniem do nowej aplikacji, dodał widok i ustawić właściwość i działało dobrze.

Błąd, który widzisz sugeruje, że w pewnym momencie zmieniłeś widok z powrotem na zwykły UIView w inspektorze tożsamości (w takim przypadku pozostają atrybuty zdefiniowane przez użytkownika).

enter image description here

+0

Cóż, obecnie dostaję "Usterkę Segmentacji: 11", gdy próbuję uruchomić, więc nie mam pojęcia, co się dzieje. To może być przyczyną tego. Cieszę się, że mam właściwy kod. Zainstalowałem Xcode 4 (powody) dzisiaj, więc zastanawiam się, czy ta instalacja pomieszała kompilatory czy coś ?! W każdym razie dzięki. Zatrzymam projekt Swift: D – Fogmeister

+0

OMLG! Błąd seg został spowodowany tym, że użyłem '.clearColor()' w atrybucie zamiast 'UIColor.clearColor()', ale w kodzie nie było żadnych błędów. W każdym razie wszystko działa: D! – Fogmeister

1

Kiedy kolor jest ustawiony trzeba zaktualizować właściwość textLabel jak poniżej za pomocą didSet

@IBInspectable var color: UIColor = UIColor.blackColor() { 
    didSet { 
     textLabel.textColor = color 
    } 
} 
+0

I dodał, że. Ale właśnie zauważyłem, że dostaję także ostrzeżenia ... "Ignorowanie zdefiniowanego przez użytkownika atrybutu runtime dla koloru keyPath ..." Dodano to pytanie. – Fogmeister

Powiązane problemy