Toolbar im Xcode Style in Swift 2.2 erstellen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Toolbar im Xcode Style in Swift 2.2 erstellen

    Hallo Forum,

    ich möchte gerne in meiner macOS Anwendung ein Textfeld mit Progressbar realisieren um optisch den jeweiligen Fortschritt anzuzeigen.
    Die Umsetzung, hier als Lösungsansatz bei (Stackoverflow), ist ein Textfeld mit integriertem drawRect.
    Das läuft soweit auch. Beim Start werden voreingestellte Werte gezeichnet, die Variablen inProgress und progress werden auch überwacht,
    jedoch werden die Änderungen der Variable progress nicht gezeichnet. Wer kann helfen?

    [Blockierte Grafik: http://www.icodeblog.de/osxforum/pic1.png]


    Hier der Quellcode der abgeleiteten Klasse von NSTextField

    Quellcode

    1. class ToolbarTextField: NSTextField {
    2. var button = NSButton()
    3. var inProgress: Bool = false {
    4. didSet {
    5. needsDisplay = false
    6. self.button.hidden = !self.inProgress
    7. self.button.needsDisplay = true
    8. self.button.enabled = true
    9. display()
    10. }
    11. }
    12. var progress: CGFloat = 0.4 {
    13. didSet {
    14. self.progress = 0.0
    15. needsDisplay = true
    16. self.button.needsDisplay = true
    17. display()
    18. displayIfNeeded()
    19. }
    20. }
    21. var viewController: NSViewController? = nil {
    22. didSet {
    23. self.button.target = self.viewController
    24. //self.button.action = Selector("cancelLoadingButtonClicked:")
    25. }
    26. }
    27. override func awakeFromNib() {
    28. let buttonFrame = NSMakeRect(0.0, 0.0, 16.0, 16.0)
    29. self.button = NSButton(frame: buttonFrame)
    30. self.button.setButtonType(NSButtonType.MomentaryChangeButton)
    31. self.button.bezelStyle = NSBezelStyle.RegularSquareBezelStyle
    32. self.button.bordered = false
    33. self.button.imagePosition = NSCellImagePosition.ImageOnly
    34. self.button.image = NSImage(named: NSImageNameStopProgressFreestandingTemplate)
    35. self.button.hidden = !self.inProgress
    36. self.addSubview(self.button)
    37. }
    38. override func drawRect(dirtyRect: NSRect) {
    39. super.drawRect(dirtyRect)
    40. if self.inProgress {
    41. let buttonFrame = NSMakeRect(self.bounds.size.width - 22, ceil((self.bounds.size.height / 2) - 9), 16.0, 16.0)
    42. self.button.frame = buttonFrame
    43. var progressRect = self.bounds
    44. progressRect.origin.y = progressRect.size.height - 4
    45. progressRect.size.height = 2
    46. progressRect.size.width *= self.progress
    47. NSColor.alternateSelectedControlColor().set()
    48. NSRectFillUsingOperation(progressRect, NSCompositingOperation.CompositeSourceIn)
    49. }
    50. }
    Alles anzeigen
  • Dei Zeilen 14 bis 18 sind ganz übel. Warum setzt du den Wert, nachdem er geändert wurde, auf 0? Den Setter in didSet aufzurufen, hört sich auch nach keiner guten Idee an. Warum erzwingst du das Neuzeichnen des Buttons, wenn sich der Wert des Fortschritts geändert hat? Die Aufrufe von setNeedsDisplay, display und displayIfNeeded wirken vollkommen konfus und undurchdacht. Zum Neizeichnen reicht in der Regel setNeedsDisplay. Du solltest dir dringend die Doku durchlesen, wie das Zeichnen von Views funktioniert.
    „Meine Komplikation hatte eine Komplikation.“
  • Welches Verhalten erwartest Du eigentlich bei diesem Abschnitt?

    Brainfuck-Quellcode: 12

    1. var progress: CGFloat = 0.4 {
    2. didSet {
    3. self.progress = 0.0
    4. // ...
    5. }
    6. }


    Als Objective-C Äquivalent:

    C-Quellcode

    1. - (void) setProgress: (CGFloat) newValue {
    2. _currentValue = 0.0;
    3. // warning: newValue is never used
    4. }


    Du verschleierst also sehr schön die Variablennamen und egal auf was progress gesetzt werden soll, beim Betreten des Setters setzt Du es auf 0.0
    (Offensichtlich ist Swift schlau genug innerhalb des Setters direkt den Wert zu bearbeiten statt in einer Endlosschleife zu landen. Hut ab!)
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • nussratte schrieb:

    Weil das nach 10 Tagen ohne weitere Antworten automatisch passiert
    Danke, das wusste ich nicht


    macmoonshine schrieb:

    Dei Zeilen 14 bis 18 sind ganz übel. Warum setzt du den Wert, nachdem er geändert wurde, auf 0? Den Setter in didSet aufzurufen, hört sich auch nach keiner guten Idee an. Warum erzwingst du das Neuzeichnen des Buttons, wenn sich der Wert des Fortschritts geändert hat? Die Aufrufe von setNeedsDisplay, display und displayIfNeeded wirken vollkommen konfus und undurchdacht. Zum Neizeichnen reicht in der Regel setNeedsDisplay. Du solltest dir dringend die Doku durchlesen, wie das Zeichnen von Views funktioniert.
    Das Beispiel hatte ich vom Kollegen von Stackoverflow übernommen. Der Klang so überzeugend, das ich schon gedacht habe, ich habe sie nicht all an der Waffel und habe die Doku falsch verstanden.

    Zitat vom kmr: Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :P

    Nicht alles, aber vieles und nicht immer schlecht gefahren.

    Danke für den Tip;-)




    Marco Feltmann schrieb:

    Welches Verhalten erwartest Du eigentlich bei diesem Abschnitt?

    Brainfuck-Quellcode

    1. var progress: CGFloat = 0.4 {
    2. didSet {
    3. self.progress = 0.0
    4. // ...
    5. }
    6. }

    Als Objective-C Äquivalent:

    Quellcode

    1. - (void) setProgress: (CGFloat) newValue {
    2. _currentValue = 0.0;
    3. // warning: newValue is never used
    4. }

    Du verschleierst also sehr schön die Variablennamen und egal auf was progress gesetzt werden soll, beim Betreten des Setters setzt Du es auf 0.0
    (Offensichtlich ist Swift schlau genug innerhalb des Setters direkt den Wert zu bearbeiten statt in einer Endlosschleife zu landen. Hut ab!
    Die Schlauheit von Swift (die sich permanent ändert) kann auch leicht in die Irre führen.
    Dein Tip vom Objektiv-C Äquivalent ist Klasse, manchmal sieht man den Wald vor lauter Bäumen nicht.

    Und plötzlich steht man wieder als kompletter Trottel da;-(
  • Marco Feltmann schrieb:

    Welches Verhalten erwartest Du eigentlich bei diesem Abschnitt?

    Brainfuck-Quellcode

    1. var progress: CGFloat = 0.4 {
    2. didSet {
    3. self.progress = 0.0
    4. // ...
    5. }
    6. }

    Als Objective-C Äquivalent:

    Quellcode

    1. - (void) setProgress: (CGFloat) newValue {
    2. _currentValue = 0.0;
    3. // warning: newValue is never used
    4. }
    Na ja. Wenn das ein Äquivalent sein soll, dann fehlt vor Zeile zwei noch

    _currentValue = newValue;

    Marco Feltmann schrieb:

    (Offensichtlich ist Swift schlau genug innerhalb des Setters direkt den Wert zu bearbeiten statt in einer Endlosschleife zu landen. Hut ab!)
    Das liegt daran, dass willSet/didSet keine Setter sind, sondern Property Observer. Die funktionieren ein wenig anders, als ein Setter in Objective-C.
  • Ich bin gegenüber Swift ja prinzipiell positiv eingestellt.

    Der Witz ist meines Erachtens aber, dass KVO keine Eigenschaft von Objective-C ist, da die Sprache so flexibel ist, dass man das nicht als Sprachkonstrukt formulieren muss, sondern frank und frei mit der Sprache implementieren kann. Dafür kann Objective-C halt keinen Scheißhaufenoperator. (Ich weiß, ich wiederhole mich.)
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Amin Negm-Awad ()

  • Amin Negm-Awad schrieb:

    Okay, dann halt Scheißhaufenmethode. Das war aber doch nicht schon immer so!?
    Keine Ahnung. Wahrscheinlich ging es bis Version 1.2.1.5.7 wurde danach aber verworfen, weil es zu perlisch ist. Wahrscheinlich kommt's in Swift 7.3.1.1.1.1 wieder, damit die Gemeinde etwas hat, worauf sie sich freuen kann. Ist ja auch modern, weil Emoji und Perl ja doch kein Operator-Overloading noch Unicode-Bezeichner erlaubt.
    „Meine Komplikation hatte eine Komplikation.“