UIButton enable

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

  • UIButton enable

    Hallo,

    ich denke einfach mal da ist bei mir ein ganz dummer Denkfehler. Ich hab ein Loginform, das einen HTTP-Request über einen anderen Thread absetzt und dann direkt deaktiviert wird, sprich die textfelder und buttons sollen disabled werden bis er responce vom Server da ist bzw. die empfangenen Daten verarbeitet sind.
    Die Textfelder lassen sich auch einwandfrei deaktivieren bzw. aktivieren nachdem die Daten wieder da sind. Nur die Buttons 'spinnen' ein bißchen rum. Wenn ich die Aktion fürs 'enablen' weglasse sind und bleiben (logischerweise) deaktiviert, sobald ich aber die Aktivierung wieder implementiere werden sie erst gar nicht deaktiviert.

    Der Ablauf ist folgender:
    - Login Daten eintragen
    - Absenden mittels Button
    - Felder deaktivieren (enable=NO)
    - Daten absenden
    - Daten empfangen
    - Form per Notification benachrichtigen
    - Felder aktivieren

    Hier ist der Code der die Felder de- bzw. aktiviert:

    Quellcode

    1. - (void) enableLoginForm: (bool) switchBool {
    2. UIButton *loginButton = (UIButton *)[self.view viewWithTag:150];
    3. UIButton *registerButton = (UIButton *)[self.view viewWithTag:151];
    4. loginButton.enabled = switchBool;
    5. registerButton.enabled = switchBool;
    6. UITextField * usernameTextField = (UITextField *)[self.view viewWithTag:125];
    7. UITextField * passwordTextField = (UITextField *)[self.view viewWithTag:126];
    8. if (!switchBool) {
    9. usernameTextField.textColor = [UIColor grayColor];
    10. usernameTextField.enabled = switchBool;
    11. passwordTextField.textColor = [UIColor grayColor];
    12. passwordTextField.enabled = switchBool;
    13. } else {
    14. usernameTextField.enabled = switchBool;
    15. usernameTextField.textColor = [UIColor blackColor];
    16. passwordTextField.enabled = switchBool;
    17. passwordTextField.textColor = [UIColor blackColor];
    18. }
    19. }
    Alles anzeigen
    * »Es ist sehr gut denkbar, daß
    * die Herrlichkeit des Lebens um jeden und immer in ihrer
    * ganzen Fülle bereit liegt, aber verhängt, in der Tiefe, unsichtbar,
    * sehr weit. Aber sie liegt dort, nicht feindselig, nicht widerwillig,
    * nicht taub. Ruft man sie mit dem richtigen Wort,
    * beim richtigen Namen, dann kommt sie. Das ist das Wesen
    * der Zauberei, die nicht schafft, sondern ruft.«
    *
    * Kafka
  • Hast Du die Tags im Interface Builder richtig gesetzt?

    Ich finde Deinen Code zwar recht sauber aber etwas umständlich. Warum verwendest Du keine Outlets?
    Anstelle die Eingabefelder einzeln zu deaktivieren könntest Du auch einen transparenten UIView (schwarze Hintergrundfarbe mit Alphawert zwischen 0.3 und 0.8) vor Deine Eingabeelemente legen. Dann kannst Du die Elemente auch nicht bedienen. Auf den View kannst Du außerdem noch einen UIActivityIndicator legen...
    „Meine Komplikation hatte eine Komplikation.“
  • Hmm, das mit dem View und dem Indicator ist echt ein guter Ansatz - ich denke dann werde ich das in Kombination mit dem deaktivieren der Textfelder machen - damit der User sieht das gerade etwas passiert.

    Ich arbeite ohne Interface Builder - von daher hab ich auch keine Outlets. Ist das Progammtechnisch ein Nachteil?

    Vielen Dank für deine Antwort.
    * »Es ist sehr gut denkbar, daß
    * die Herrlichkeit des Lebens um jeden und immer in ihrer
    * ganzen Fülle bereit liegt, aber verhängt, in der Tiefe, unsichtbar,
    * sehr weit. Aber sie liegt dort, nicht feindselig, nicht widerwillig,
    * nicht taub. Ruft man sie mit dem richtigen Wort,
    * beim richtigen Namen, dann kommt sie. Das ist das Wesen
    * der Zauberei, die nicht schafft, sondern ruft.«
    *
    * Kafka
  • Inos schrieb:

    "Felder deaktivieren (enable=NO)"
    Dann ist switchtBool == NO ?
    Wenn die Textfelder und Buttons deaktiviert werden sollen - ja.
    * »Es ist sehr gut denkbar, daß
    * die Herrlichkeit des Lebens um jeden und immer in ihrer
    * ganzen Fülle bereit liegt, aber verhängt, in der Tiefe, unsichtbar,
    * sehr weit. Aber sie liegt dort, nicht feindselig, nicht widerwillig,
    * nicht taub. Ruft man sie mit dem richtigen Wort,
    * beim richtigen Namen, dann kommt sie. Das ist das Wesen
    * der Zauberei, die nicht schafft, sondern ruft.«
    *
    * Kafka
  • jesse.james schrieb:

    Ich arbeite ohne Interface Builder - von daher hab ich auch keine Outlets. Ist das Progammtechnisch ein Nachteil?

    Ich finde den Interface Builder eher einen Vorteil ;) aber das ist Geschmackssache.

    Auch ohne Interface Builder kannst Du natürlich Attribute auf die Elemente festlegen. Also beispielsweise die Variable loginButton in den Header ziehen und ihr in loadView den entsprechenden Button zuweisen. Und schon kannst Du auf die Tags verzichten. ;)
    „Meine Komplikation hatte eine Komplikation.“
  • Ja stimmt, das geht auch. Aber ich muß zugeben das am Anfang meiner Planungsphase der Button in nur einer Methode zur Verfügung stehen sollte und sich das mittlerweile ein wenig ausgeweitet hat. Ich denke das werde ich auch umschreiben da es auch die Rechenzeit verkürzen sollte - jedesmal den Tag auslesen ist Performancetechnisch bestimmt nicht von Vorteil.

    Ich bin in obj-c noch nicht so versiert und möchte mir mit den zusätzlichen Code Einlagen die der Interface Builder normalerweise übernimmt den Syntax besser einprägen. Deswegen arbeite ich jetzt erstmal mit dem Code selber und steige später auf den IB um. Aber danke der Tips.
    * »Es ist sehr gut denkbar, daß
    * die Herrlichkeit des Lebens um jeden und immer in ihrer
    * ganzen Fülle bereit liegt, aber verhängt, in der Tiefe, unsichtbar,
    * sehr weit. Aber sie liegt dort, nicht feindselig, nicht widerwillig,
    * nicht taub. Ruft man sie mit dem richtigen Wort,
    * beim richtigen Namen, dann kommt sie. Das ist das Wesen
    * der Zauberei, die nicht schafft, sondern ruft.«
    *
    * Kafka
  • Aber ich muß jetzt noch mal Nachfragen, weil mich das schon ein bißchen nervt. WARUM lassen die Buttons sich nicht de- oder aktivieren? Ergibt das einen Sinn?
    * »Es ist sehr gut denkbar, daß
    * die Herrlichkeit des Lebens um jeden und immer in ihrer
    * ganzen Fülle bereit liegt, aber verhängt, in der Tiefe, unsichtbar,
    * sehr weit. Aber sie liegt dort, nicht feindselig, nicht widerwillig,
    * nicht taub. Ruft man sie mit dem richtigen Wort,
    * beim richtigen Namen, dann kommt sie. Das ist das Wesen
    * der Zauberei, die nicht schafft, sondern ruft.«
    *
    * Kafka
  • jesse.james schrieb:

    WARUM lassen die Buttons sich nicht de- oder aktivieren? Ergibt das einen Sinn?

    Natürlich lassen sich Buttons (de-)aktivieren. Wie bereits geschrieben: Kann es sein, dass die Tags der Buttons nicht stimmen? Setz' doch mal einen Breakpoint und schau' Dir die Werte der Buttonvariablen an.

    jesse.james schrieb:

    Ich denke das werde ich auch umschreiben da es auch die Rechenzeit verkürzen sollte - jedesmal den Tag auslesen ist Performancetechnisch bestimmt nicht von Vorteil.

    Das finde ich nicht sooo schlimm. Aber x-Mal den gleichen Code zu haben, finde ich unschön. Das stinkt ;)
    „Meine Komplikation hatte eine Komplikation.“
  • Wie gesagt, wenn ich das aktivieren (enable=yes) rausnehme werden sie ja deaktiviert (enable=no) - dann muß der tag ja auch stimmen. Das einzigste was ich mir vorstellen kann das der Notification vorgeladen und der Code teilweise schon ausgeführt wird, hat meiner Meinung zwar keinen Sinn aber was anderes kann ich mir zur Zeit einfach nicht vorstellen.

    Ja klar, mir gefällt das auch nicht mit dem wiederholen der Codefetzen und das werde ich auch noch ändern.
    * »Es ist sehr gut denkbar, daß
    * die Herrlichkeit des Lebens um jeden und immer in ihrer
    * ganzen Fülle bereit liegt, aber verhängt, in der Tiefe, unsichtbar,
    * sehr weit. Aber sie liegt dort, nicht feindselig, nicht widerwillig,
    * nicht taub. Ruft man sie mit dem richtigen Wort,
    * beim richtigen Namen, dann kommt sie. Das ist das Wesen
    * der Zauberei, die nicht schafft, sondern ruft.«
    *
    * Kafka
  • macmoonshine schrieb:

    ...oder das enable = YES wird aus irgendeinem Grund nach dem Deaktiveren noch ausgeführt. Auch hier sollte ein Breakpoint Erleuchtung bringen.

    Ich finde den Methodenaufbau auch eher merkwürdig, eben wegen des doppelten Codes.
    Was passiert bei folgender Änderung:

    C-Quellcode

    1. if (!switchBool) {
    2. usernameTextField.textColor = [UIColor grayColor];
    3. passwordTextField.textColor = [UIColor grayColor];
    4. } else {
    5. usernameTextField.textColor = [UIColor blackColor];
    6. passwordTextField.textColor = [UIColor blackColor];
    7. }
    8. usernameTextField.enabled = switchBool;
    9. passwordTextField.enabled = switchBool;
    «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
  • AR.DDev schrieb:

    [... setEnabled:YES] bzw. [... setEnabled:NO]. Siehe Doku. ;)

    Der Unterschied zwischen button.enabled = YES; und [button setEnabled:YES]; ist laut Doku genau welcher?

    Ich würde ja sowieso eher [button setValue:YES forKey:@"enabled"]; nutzen.
    Was sagt die Doku darüber?
    :rolleyes:
    «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
  • Lucas de Vil schrieb:

    Ich finde den Methodenaufbau auch eher merkwürdig, eben wegen des doppelten Codes.
    Was passiert bei folgender Änderung:

    C-Quellcode

    1. if (!switchBool) {
    2. usernameTextField.textColor = [UIColor grayColor];
    3. passwordTextField.textColor = [UIColor grayColor];
    4. } else {
    5. usernameTextField.textColor = [UIColor blackColor];
    6. passwordTextField.textColor = [UIColor blackColor];
    7. }
    8. usernameTextField.enabled = switchBool;
    9. passwordTextField.enabled = switchBool;
    Genau das selbe wie vorher auch. Nur das hier die Textfelder nicht deaktiviert werden, aber die Buttons sind immer noch aktiviert.
    * »Es ist sehr gut denkbar, daß
    * die Herrlichkeit des Lebens um jeden und immer in ihrer
    * ganzen Fülle bereit liegt, aber verhängt, in der Tiefe, unsichtbar,
    * sehr weit. Aber sie liegt dort, nicht feindselig, nicht widerwillig,
    * nicht taub. Ruft man sie mit dem richtigen Wort,
    * beim richtigen Namen, dann kommt sie. Das ist das Wesen
    * der Zauberei, die nicht schafft, sondern ruft.«
    *
    * Kafka
  • jesse.james schrieb:

    Nur das hier die Textfelder nicht deaktiviert werden, aber die Buttons sind immer noch aktiviert.

    Das klingt nicht gut. Vom Prinzip her sollte die Funktionalität identisch sein.

    Halten wir fest: in der IF-Abfrage werden die Textfelder deaktiviert, außerhalb nicht.
    Halten wir weiter fest: die Buttons, die außerhalb der Abfrage stehen, werden nicht deaktiviert.

    Theorie: Packst du die Buttons ebenfalls mit doppeltem Code in die Abfragen, werden sie korrekt deaktiviert bzw. aktiviert.

    Halt, moment mal! Natürlich!

    C-Quellcode

    1. bool true = YES;
    2. bool false != true;
    3. bool wrong = !true;


    if(!NO) prüft in diesem Fall nicht! Es ändert auf YES. Das klappt immer, deshalb wird der Teil der Schleife korrekt durchlaufen.

    if(switchBool == NO) sollte die Probleme beseitigen.

    //Nachtrag
    Gegengeprüft, war Blödsinn. +öhm+
    «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

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Lucas de Vil ()

  • Sodele, jetzt hab ich es mal in folgende Variante geändert:

    Quellcode

    1. - (void) enableLoginForm: (bool) switchBool {
    2. if (switchBool == NO) {
    3. usernameTextField.textColor = [UIColor grayColor];
    4. passwordTextField.textColor = [UIColor grayColor];
    5. } else {
    6. usernameTextField.textColor = [UIColor blackColor];
    7. passwordTextField.textColor = [UIColor blackColor];
    8. }
    9. usernameTextField.enabled = switchBool;
    10. passwordTextField.enabled = switchBool;
    11. loginButton.enabled = switchBool;
    12. loginButton.enabled = switchBool;
    13. }
    Alles anzeigen


    Und immer noch das selbe Problem.
    * »Es ist sehr gut denkbar, daß
    * die Herrlichkeit des Lebens um jeden und immer in ihrer
    * ganzen Fülle bereit liegt, aber verhängt, in der Tiefe, unsichtbar,
    * sehr weit. Aber sie liegt dort, nicht feindselig, nicht widerwillig,
    * nicht taub. Ruft man sie mit dem richtigen Wort,
    * beim richtigen Namen, dann kommt sie. Das ist das Wesen
    * der Zauberei, die nicht schafft, sondern ruft.«
    *
    * Kafka
  • AR.DDev schrieb:

    ich habe selber die Erfahrung gemacht, dass .enabled nicht immer funktioniert hat. probier doch bitte mal mit setEnabled.

    Wie es Lucas bereits angedeutet hat. Da gibt es keinen Unterschied. Die Zeile loginButton.enabled = switchBool; ist nur eine andere Schreibweise für [loginButton setEnabled:switchBool];
    „Meine Komplikation hatte eine Komplikation.“
  • setEnable funktioniert auch nicht.

    Ich hab jetzt testweise die Methode mal umgebaut und tadaaaa (wenn wunderst) die Buttons und die Textfelder sind und bleiben deaktiviert:

    Quellcode

    1. - (void) enableLoginForm: (bool) switchBool {
    2. if (switchBool == NO) {
    3. usernameTextField.textColor = [UIColor grayColor];
    4. passwordTextField.textColor = [UIColor grayColor];
    5. } else {
    6. usernameTextField.textColor = [UIColor blackColor];
    7. passwordTextField.textColor = [UIColor blackColor];
    8. }
    9. [usernameTextField setEnabled:NO];
    10. [passwordTextField setEnabled:NO];
    11. [loginButton setEnabled:NO];
    12. [registerButton setEnabled:NO];
    13. }
    Alles anzeigen
    * »Es ist sehr gut denkbar, daß
    * die Herrlichkeit des Lebens um jeden und immer in ihrer
    * ganzen Fülle bereit liegt, aber verhängt, in der Tiefe, unsichtbar,
    * sehr weit. Aber sie liegt dort, nicht feindselig, nicht widerwillig,
    * nicht taub. Ruft man sie mit dem richtigen Wort,
    * beim richtigen Namen, dann kommt sie. Das ist das Wesen
    * der Zauberei, die nicht schafft, sondern ruft.«
    *
    * Kafka