Mehrere UIImageView's ueber Integer im Namen ansprechen

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

  • Mehrere UIImageView's ueber Integer im Namen ansprechen

    Hallo!
    Ich habe folgendes Problem:

    Ich moechte ueber einen Integer verschiedene UIImageViews ansprechen.
    Mein h-File sieht so aus:

    Quellcode

    1. #import
    2. @interface kartenhaus4ViewController : UIViewController {
    3. IBOutlet UIImageView *view1; 
    4. IBOutlet UIImageView *view2; 
    5. IBOutlet UIImageView *view3;}
    6. CGPoint point1;
    7. NSUInteger i;
    8. @end
    Alles anzeigen




    Jetzt wuerde ich gerne im m-File den UIImageView's die Positioen des CGPoint's zuweisen. Dieser Code

    Quellcode

    1. view1.center = point1;
    2. view2.center = point1;
    3. view3.center = point1;

    soll durch eine for-Schleife ersetzt werden.

    Quellcode

    1. for(i=1;i<4;i++){...}


    Was kommt jetzt in die for-Schleife?
    Hab es mit einem String probiert:

    Quellcode

    1. NSString *viewname = [NSString stringWithFormat:@"view%d",i];
    2. "%@.center", viewname = point1;

    Aber wegen der unterschiedlichen Typen ohne Erfolg.
    Anmerkung: Das beschriebene Problem ist nur beispielhaft. Es geht nicht darum, wie man alle UIImageView's auf die gleiche Position setzt, sondern wie man sie mithilfe eines Integers anspricht.
    Vielen Dank fuer eure Hilfe!
  • Danke fuer eure Antworten!
    Ich bin noch Xcode-Anfaenger und noch nicht so tief in der Materie drin.
    Hab es mal mit dem Array versucht, weiss aber nicht genau wie das gehen soll.
    Hier mein Versuch, die Views in das Array zu schreiben:

    Quellcode

    1. NSObject *Object;
    2. myArray = [NSMutableArray arrayWithObjects:nil];
    3. for(i=1;i<4;i++)
    4. {
    5. NSString *viewname = [NSString stringWithFormat:@"view%d",i];
    6. Object = [UIImage imageNamed:viewname];
    7. [myArray addObject: Object];
    8. }


    So gehts noch nicht. Auch das mit den Subviews klingt gut. Aber weiss nicht wie ich da anfangen soll.
    Bitte um weitere Hilfe!
  • bonapple schrieb:

    So gehts noch nicht. Auch das mit den Subviews klingt gut. Aber weiss nicht wie ich da anfangen soll.

    Du legst im Interface Builder einen UIView an, der so groß ist, dass Deine ImageViews da hineinpassen. Diesen View verbindest Du dann mit einem (neuen) Outlet Deines ViewControllers. Das könnte dann so aussehen:

    Quellcode

    1. @interface MyViewController : UIViewController {
    2. @private
    3. IBOutlet UIView *imageContainerView;
    4. }
    5. - (void)doSomething;
    6. @end
    7. @implementation MyViewController
    8. - (void)doSomething {
    9. for(UIImageView *theImageView in [imageContainerView subviews]) {
    10. // do something
    11. }
    12. }
    13. @end
    Alles anzeigen
    Du solltest darauf achten, dass der Containerview keine anderen Subviews als UIImageViews enthölt.
    „Meine Komplikation hatte eine Komplikation.“
  • bonapple schrieb:

    Danke fuer eure Antworten!
    Ich bin noch Xcode-Anfaenger und noch nicht so tief in der Materie drin.
    Hab es mal mit dem Array versucht, weiss aber nicht genau wie das gehen soll.
    Hier mein Versuch, die Views in das Array zu schreiben:

    Quellcode

    1. NSObject *Object;
    2. myArray = [NSMutableArray arrayWithObjects:nil];
    3. for(i=1;i<4;i++)
    4. {
    5. NSString *viewname = [NSString stringWithFormat:@"view%d",i];
    6. Object = [UIImage imageNamed:viewname];
    7. [myArray addObject: Object];
    8. }


    So gehts noch nicht. Auch das mit den Subviews klingt gut. Aber weiss nicht wie ich da anfangen soll.
    Bitte um weitere Hilfe!
    Probiers mal hiermit:

    Quellcode

    1. NSUInteger numberOfImages = 3;
    2. NSMutableArray *imageArray = [[NSMutableArray alloc] initWithCapacity:numberOfImages];
    3. NSString *viewname;
    4. for(int i=0; i < numberOfImages; i++)
    5. {
    6. viewname = [[NSString alloc] initWithFormat:@"view%d.png",i+1];
    7. [imageArray addObject: [UIImage imageNamed:viewname]];
    8. [viewname release];
    9. }


    Danach solltest du ein Array mit deinen 3 UIImage haben.
    Abrufen kannst du sie auch ganz einfach:

    Quellcode

    1. [imageArray objectAtIndex: index]

    Dabei fängt der index natürlich bei 0 an.
    01010011 01101001 01100111 01101110 01100001 01110100 01110101 01110010

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von drobs ()

  • Key-Value-Coding

    Es geht auch so, wie Du es urspruenglich vorhattest. Naemlich ueber Key-Value-Coding:

    Quellcode

    1. for (int i = 0; i < numberOfViews; i++) {
    2. NSString *string = [NSString stringWithFormat: @"view%d", i+1];
    3. UIImageView *imageView = [self valueForKey: string];
    4. [imageView setCenter: point1];
    5. }


    Naeheres dazu kannst Du hier nachlesen.

    Ich Deinem Fall ist es aber besser, wie schon beschrieben, mit einem Array zu arbeiten.
  • Super, vielen Dank euch allen fuer eure Antworten!!
    Die Loesung mit dem valueForKey funktioniert prima!
    Mit dem Fuellen des Arrays funktioniert es noch nicht, vielleicht benoetige ich aber diese Loesung fuer meine Anschlussfrage (weiter unten).
    Probiers mal hiermit:

    Quellcode

    1. NSUInteger numberOfImages = 3;
    2. NSMutableArray *imageArray = [[NSMutableArray alloc] initWithCapacity:numberOfImages];
    3. NSString *viewname;
    4. for(int i=0; i < numberOfImages; i++)
    5. {
    6. viewname = [[NSString alloc] initWithFormat:@"view%d.png",i+1];
    7. [imageArray addObject: [UIImage imageNamed:viewname]];
    8. [viewname release];
    9. }


    Habe den Code ausprobiert, kompilieren funktioniert, aber der Simulator stuerzt ab. Der Code sieht aber eh so aus, als wuerde das Array mit Bildnamen und nicht mit UIImageViews gefuellt oder? Habe das ".png" entfernt und zum Testen auch die for-Schleife, aber der Simulator stuerzt weiterhin ab.


    Nun zu meiner Anschlussfrage.

    Jetzt sollen die CGPoint's mit einem Integer angesprochen werden. Also sie sind definiert als:

    Quellcode

    1. CGPoint point1;
    2. CGPoint point2;
    3. CGPoint point3;


    Und dieser Code soll durch eine for-Schleife ersetzt werden:

    Quellcode

    1. view.center = point1;
    2. view.center = point2;
    3. view.center = point3;
    4. //Ich weiss, dieser Code macht wenig Sinn, es geht aber nur ums Prinzip



    Wenn ich das mit dem Array machen wuerde, wie wuerde dann diese Zeile aussehen:

    Quellcode

    1. [imageArray addObject: [UIImage imageNamed:viewname]];


    Wenn ich das mit dem valueForKey machen wuerde, wie wuerde dann diese Zeile aussehen:

    Quellcode

    1. UIImageView *imageView = [self valueForKey: string];

    Hab hier schon einiges ausprobiert, aber geht noch nicht.

    Danke fuer eure Unterstuetzung!
  • Unter der Vorraussetzung dass deine points als Instanzvariablen und direkt hintereinander weg deklariert sind - und ohne es getestet zu haben (Mit Pointern geht das auf jeden Fall):
    (Und ja, bevor jetzt alle meckern, die Methode fällt wohl SEHR unter Quick+Dirty, aber es geht schneller als den halben Code von seiner Struktur her umzuschreiben)


    Quellcode

    1. for(int i = 0; i < 3; i++) { CGPoint currentPoint = (&point1 + i);}

    Das Problem ist, dass CGPoint kein Object ist, sondern ein struct, das kriegst du ohne Object-Wrapper nicht in ein Array rein.
  • Wenn die CGPoints in der h-Datei definiert sind und Setter und Getter existieren kannst Du die CGPoints auch mir valueForKey ansprechen.
    Damit die UIImageViews in das Array gepackt werden solltest Du die eine Zeile aendern:

    Quellcode

    1. UIImageView *dummyImageView = [[UIImageView alloc] initWithImage: [UIImage imageNamed:viewname]];
    2. [imageArray addObject: dummyImageView];
    3. [dummyImageView release];