titel von verschiedenen Buttons ändern mit Hilfe von Tags

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

  • titel von verschiedenen Buttons ändern mit Hilfe von Tags

    Hallo :)
    ich bin neu hier und hoffe dass mir ganz schnell geholfen werden kann...
    ich studiere jetzt im 1. Semester Angewandte informatik und wir haben gerade angefangen ObjectiveC zu proggen...
    Als Übungsaufgabe steht, dass wir mit Xcode TicTacToe für das iPhone programmieren sollen...

    Ich habe so weit alles fertig, nur finde ich einen "Befehl" nicht...

    das problem besteht darin, dass ich in einer Funktion (

    Quellcode

    1. -(IBAction)click:(id)sender )
    ) auf andere Buttons zugreifen will...
    Bei den Buttons wird nur der Titel verändert...
    es gibt aber auch einen Reset-Button, der das Spiel zurücksetzen soll

    dazu hatt ich folgende Idee:

    Quellcode

    1. [...]
    2. for(int i=0; i<9,i++){ //9 wegen der anzahl der buttons bei TicTacToe
    3. [[Button.i] setTitle:@"" forState:UIControlStateNormal]; //also dass der titel des Buttons mit dem Tag i gelöscht wird
    4. [...]


    ich weiß dass das mit [Button.i] nicht funktioniert...
    wie schreibt man das??? geht das überhaupt so einfach? (weil dazu sind die Tags doch egtl da, oder?!

    wäre echt dankbar über schnelle Hilfe...
    ich durchforste schon seit Stunden die Cocoa/ObjectiveC-References und google und alles über was ich sonst noch stolpere aber ich werde einfach nicht fündig...
    über die forum.suchfunktion hab ich leider auch nichts gefunden...

    bitte helft mir...
    das ist das letzte Puzzlestück was noch fehlt :)

    Greetz
    Crayven
  • Statt @"" kannst du auch gleich nil nehmen!

    Quellcode

    1. - (IBAction)click:(id)sender {
    2. if ([sender tag] == 1) {
    3. [sender setTitle:nil forState:UIControlStateNormal];
    4. }
    5. // oder
    6. if ([[sender title] isEqualToString:@"..."]) {
    7. [sender setTitle:nil forState:UIControlStateNormal];
    8. }
    9. }

    Dabei wird allerdings nur der Title verändert. Wenn du den Button ganz gelöscht haben möchtest, mach es mit [sender removeFromSuperview];
  • crayven schrieb:

    ich weiß dass das mit [Button.i] nicht funktioniert...
    wie schreibt man das??? geht das überhaupt so einfach? (weil dazu sind die Tags doch egtl da, oder?!

    Pack' die Buttons einfach alle in einen View. Für den View legst Du ein Outlet (z. B. buttonContainer) an. Dann kannst Du über eine Fast-Enumeration durch die Buttons iterieren:

    Quellcode

    1. for(UIButoon *theButton in buttonContainer.subviews) {
    2. ...
    3. }
    „Meine Komplikation hatte eine Komplikation.“
  • AR.DDev schrieb:

    Statt @"" kannst du auch gleich nil nehmen!

    Quellcode

    1. - (IBAction)click:(id)sender {
    2. if ([sender tag] == 1) {
    3. [sender setTitle:nil forState:UIControlStateNormal];
    4. }
    5. // oder
    6. if ([[sender title] isEqualToString:@"..."]) {
    7. [sender setTitle:nil forState:UIControlStateNormal];
    8. }
    9. }

    Dabei wird allerdings nur der Title verändert. Wenn du den Button ganz gelöscht haben möchtest, mach es mit [sender removeFromSuperview];

    hey danke...aber wird dabei nicht nur der Title von dem Button gelöscht, auf den ich geklickt habe? eben vom sender?!
    Ich brauch ja ne Möglichkeit mehrere zu löschen...

    @macmoonshine...
    hm...auch erstmal danke :) also das mit den Tags ansprechen geht gar nicht? wozu sind die denn dann da?!
    Weil ich bräuchte ja noch eine Abfrage der Siegbedingungen also sowas in der Art:

    Quellcode

    1. if( [[UIButton.1] currentTitle]==[[UIButton.2]currentTitle]==[[UIButton.3]currentTitle] || [[UIButton.4] currentTitle]==[[UIButton.5]currentTitle] ......


    also dass er die Titles jeder Reihe vergleicht und wenn alle 3 gleich sind das Spiel unterbricht.,..
    das wollt ich auch mit dem Zugrifff über Tags machen :(

    hab jetzt auch zur Realisierung der Gewinnbedinungen folgendes versucht:

    jedem Button einen pointer zugewiesen (UIButton *button1,*button2,*button3,...,*button9)
    abfrage: (

    if( [button1 currentTitle]==[button2 currentTitle]==[button3 currentTitle] || ... ) {
    }

    )

    da wird mir dann aber die Warnung ausgegeben: "Comparison between pointer and integer" und die Bedingung ist immer wahr ;)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von crayven () aus folgendem Grund: -doppelquote gelöscht -Infos hinzugefügt

  • crayven schrieb:

    hm...auch erstmal danke also das mit den Tags ansprechen geht gar nicht? wozu sind die denn dann da?!

    Doch, das geht natürlich auch. Du kannst auch beides zusammen einsetzen. Wenn Du aber alle Buttons verändern willst, ist die Schleife über die Subviews meines Erachtens eleganter als jeden Button über sein Tag herauszufriemeln.
    „Meine Komplikation hatte eine Komplikation.“
  • macmoonshine schrieb:

    crayven schrieb:

    hm...auch erstmal danke also das mit den Tags ansprechen geht gar nicht? wozu sind die denn dann da?!

    Doch, das geht natürlich auch. Du kannst auch beides zusammen einsetzen. Wenn Du aber alle Buttons verändern willst, ist die Schleife über die Subviews meines Erachtens eleganter als jeden Button über sein Tag herauszufriemeln.
    cool...und wie geht das?! was muss ich eingeben um beispielsweise den title vom Button mit dem Tag 3 zubekommen?!

    EDIT: Eleganz spielt derzeit nur eine untergeordnete Rolle... :P
  • stimmt schon...Eleganz ist schon wichtig...aber Priorität 1 ist das erstmal zum laufen zu bringen... :)

    hm...
    wenn ich eingebe

    [[viewWithTag:1]currentTitle] zeigt er mir an "'viewWithTag' undeclared"
    und wenn ich noch ne Übergangsvariable deklariere wie UIButton *testbutton und dann schreib
    [[(testbutton)viewWithTag:1]currentTitle] zeigt er an " 'UIView may not respond to '-currentTitle' "
    und nu? ich bin ratlos :(
  • UIButton ist eine Unterklasse von UIView. Du kannst die Warnung durch Casten verhindern.

    Quellcode

    1. [(UIButton *) [testbutton viewWithTag:1] currentTitle]
    Wo wir schon beim Thema Eleganz sind. Hier ist es sicherlich leserlicher, eine Variable zu verwenden und den Code auf mehrere Zeilen zu verteilen.
    „Meine Komplikation hatte eine Komplikation.“
  • Na das wollt ich doch auch für die Überprüfung benutzen für die Siegbedingungen

    also

    Quellcode

    1. if( [(UIButton*)[testbutton viewWithTag:1]currentTitle]==[(UIButton*)[testbutton viewWithTag:2]currentTitle]==[(UIButton*)[testbutton viewWithTag:3]currentTitle] ||
    2. [(UIButton*)[testbutton viewWithTag:3]currentTitle]==[(UIButton*)[testbutton viewWithTag:4]currentTitle]==[(UIButton*)[testbutton viewWithTag:5]currentTitle] ||
    3. [...] //bis alleSiegbedingungen geschrieben sind
  • Ich sags auch noch mal: Grundlagen!

    Zum einen vergleicht man NSString Objekte mit der Methode isEqualToString:. Mit dem Operator == vergleichst Du nur die Pointer, bzw. Du versuchst es. Das geht aber schief, weil Du schreibst:

    object1 == object2 == object3

    Die Auswertung erfolgt aber nicht so, wie Du Dir das vorstellst. Es werden nämlich erst zwei Zeiger verglichen und ergeben dann YES oder NO. Dieses Ergebnis wird dann mit dem dritten Zeiger verglichen und upps, YES oder NO sind gar keine Zeiger mit denen man einen anderen Zeiger sinnvoll vergleichen könnte.

    Also: Grundlagen pauken.

    Michael
  • Okay...stimmt schon...Hab jetzt auch ne idee wie ich es mit "isEqualToString" schaffen kann...aber er zeigt mir an dass er die Funktion nicht kennt obwohl ich die String.h in meine Header inkludiert habe :( hab auch schon in der Reference nachgeschaut aber da ist ja kein beispielcode wie man es richtig verwendet...kann jmd von euch das kurz schreiben?
  • crayven schrieb:

    hab auch schon in der Reference nachgeschaut aber da ist ja kein beispielcode wie man es richtig verwendet...

    Die grundsätzliche Syntax, wie man in Objektive-C Methoden aufruft ist Dir aber bekannt? Ich mein dafür, dass Dir nur noch „das letzte Puzzlestück“ fehlt, hängst Du an ziemlichen Basics fest.

    crayven schrieb:

    kann jmd von euch das kurz schreiben?

    [string1 isEqualToString:string2]

    Michael
  • mit dem "letzten Puzzlestück" meinte ich auch egtl die Siegesüberprüfung und den Reset...

    ich weiß dass ich unbedingt die Grundlagen lernen muss aber es war bis jetzt wg zeitmangel nicht möglich...wir lernen halt nur die Funktionen und tw was dahinter steht.,.ich werd mir auch demnächst ein Buch über Objective C kaufen (wenn ihr ein gutes Buch kennt könnt ihr es mir ja nennen ;) )
    tut mir leid dass ich mich so schwer tu :P

    okay...hier hab ich mal den kompletten Quelltext...
    Das Programm wird schonmal nicht abgebrochen aber das reset löscht nicht die Titles der Buttons und die Überprüfung funktioniert auch nciht...

    header

    Quellcode

    1. #import <UIKit/UIKit.h>
    2. #import <Foundation/NSString.h>
    3. @interface TicTacToeViewController : UIViewController {
    4. IBOutlet UILabel *PlayerLabel, *errorLabel;
    5. int player,breaker;
    6. NSString *button1Name,*button2Name, *button3Name, *button4Name, *button5Name, *button6Name, *button7Name,*button8Name,*button9Name;
    7. NSString *x,*o;
    8. UIButton *testButton;
    9. }
    10. -(IBAction)reset;
    11. -(IBAction)click:(id)sender;
    12. @end
    Alles anzeigen


    main

    Quellcode

    1. #import "TicTacToeViewController.h"
    2. @implementation TicTacToeViewController
    3. - (id) init
    4. {
    5. self = [super init];
    6. if (self != nil) {
    7. player=0;
    8. }
    9. return self;
    10. }
    11. -(IBAction)reset{
    12. for (int i=1;i<=9;i++) {
    13. [(UIButton*)[testButton viewWithTag:i]setTitle:@"" forState:UIControlStateNormal];
    14. }
    15. breaker=0;
    16. player=0;
    17. [errorLabel setText:nil];
    18. [PlayerLabel setText:@"RESET! Spieler 1 an der Reihe"];
    19. }
    20. -(IBAction)click:(id)sender{
    21. button1Name=[(UIButton*)[testButton viewWithTag:1]currentTitle];
    22. button2Name=[(UIButton*)[testButton viewWithTag:2]currentTitle];
    23. button3Name=[(UIButton*)[testButton viewWithTag:3]currentTitle];
    24. button4Name=[(UIButton*)[testButton viewWithTag:4]currentTitle];
    25. button5Name=[(UIButton*)[testButton viewWithTag:5]currentTitle];
    26. button6Name=[(UIButton*)[testButton viewWithTag:6]currentTitle];
    27. button7Name=[(UIButton*)[testButton viewWithTag:7]currentTitle];
    28. button8Name=[(UIButton*)[testButton viewWithTag:8]currentTitle];
    29. button9Name=[(UIButton*)[testButton viewWithTag:9]currentTitle];
    30. x=[NSString stringWithFormat:@"X"];
    31. o=[NSString stringWithFormat:@"O"];
    32. if(breaker==0){
    33. if ([sender currentTitle]==nil) {
    34. [errorLabel setText:nil];
    35. if (player==0) {
    36. [sender setTitle:@"X" forState:UIControlStateNormal];
    37. player=1;
    38. [PlayerLabel setText:@"Spieler 2 an der Reihe"];
    39. }
    40. else {
    41. [sender setTitle:@"O" forState:UIControlStateNormal];
    42. player=0;
    43. [PlayerLabel setText:@"Spieler 1 an der Reihe"];
    44. }
    45. }
    46. else
    47. [errorLabel setText:@"Gültiges Feld auswählen!"];
    48. if ([button1Name isEqualToString:x]==TRUE&&[button2Name isEqualToString:x]==TRUE&&[button3Name isEqualToString:x]==TRUE ||
    49. [button4Name isEqualToString:x]==TRUE&&[button5Name isEqualToString:x]==TRUE&&[button6Name isEqualToString:x]==TRUE ||
    50. [button7Name isEqualToString:x]==TRUE&&[button8Name isEqualToString:x]==TRUE&&[button9Name isEqualToString:x]==TRUE ||
    51. [button1Name isEqualToString:x]==TRUE&&[button4Name isEqualToString:x]==TRUE&&[button7Name isEqualToString:x]==TRUE ||
    52. [button2Name isEqualToString:x]==TRUE&&[button5Name isEqualToString:x]==TRUE&&[button8Name isEqualToString:x]==TRUE ||
    53. [button3Name isEqualToString:x]==TRUE&&[button6Name isEqualToString:x]==TRUE&&[button9Name isEqualToString:x]==TRUE ||
    54. [button1Name isEqualToString:x]==TRUE&&[button5Name isEqualToString:x]==TRUE&&[button9Name isEqualToString:x]==TRUE ||
    55. [button3Name isEqualToString:x]==TRUE&&[button5Name isEqualToString:x]==TRUE&&[button7Name isEqualToString:x]==TRUE ) {
    56. breaker=1;
    57. [PlayerLabel setText:@"Spieler 1 hat gewonnen"];
    58. }
    59. if ([button1Name isEqualToString:o]==TRUE&&[button2Name isEqualToString:o]==TRUE&&[button3Name isEqualToString:o]==TRUE ||
    60. [button4Name isEqualToString:o]==TRUE&&[button5Name isEqualToString:o]==TRUE&&[button6Name isEqualToString:o]==TRUE ||
    61. [button7Name isEqualToString:o]==TRUE&&[button8Name isEqualToString:o]==TRUE&&[button9Name isEqualToString:o]==TRUE ||
    62. [button1Name isEqualToString:o]==TRUE&&[button4Name isEqualToString:o]==TRUE&&[button7Name isEqualToString:o]==TRUE ||
    63. [button2Name isEqualToString:o]==TRUE&&[button5Name isEqualToString:o]==TRUE&&[button8Name isEqualToString:o]==TRUE ||
    64. [button3Name isEqualToString:o]==TRUE&&[button6Name isEqualToString:o]==TRUE&&[button9Name isEqualToString:o]==TRUE ||
    65. [button1Name isEqualToString:o]==TRUE&&[button5Name isEqualToString:o]==TRUE&&[button9Name isEqualToString:o]==TRUE ||
    66. [button3Name isEqualToString:o]==TRUE&&[button5Name isEqualToString:o]==TRUE&&[button7Name isEqualToString:o]==TRUE ) {
    67. breaker=1;
    68. [PlayerLabel setText:@"Spieler2 hat gewonnen"];
    69. }
    70. }
    71. else
    72. [errorLabel setText:@"Zum Neustarten bitte reset drücken"];
    73. }
    Alles anzeigen


    es gibt halt 9 Buttons die mit "click" verknüpft sind und einen reset button der mit "reset" verknüpft ist und 2 Label...
    das Problem bei der Überprüfung ist, dass die funktionen mit "button1name" und so auch nach funktionsaufruf noch (null) haben...
    aber ich weiß nicht worans liegt...

    danke euch allen für die Hilfe