UIImageView macht Probleme beim Bildwechseln

  • Vivid schrieb:

    wieso denkst du das?

    Man hat doch properties. Die dann sozusagen Getter/Setter sind. Und ich habe eine Instanz von myDetailView. Dann müsste ich ja auch auf die Property zugreifen können.
    Hat bei mir noch nie funktioniert soferne es sich um Outlets handelte. Bei Var. wie NSString etc. jedoch schon. Warum hast du 2 UIImageView Outlets, grafikView und image laut Beitrag 1 ?

    Vivid schrieb:

    HI!

    Ich habe einen ViewController erstellt, welcher eine UIImageView beinhaltet. Alles mit InterfaceBuilder gemacht. Nun würde ich gerne zu gegebenem Anlass das Bild wechseln. Daher habe ich mir eine Variable angelegt und diese im IB verbunden. Die Variable ist vom Typ IBOutlet UIImageView.

    Nun versuche ich so das ganze Bild zu verändern:

    Quellcode

    1. UIImage *imageTEST = [UIImage imageNamed: @"bild123.jpg"];[[detailView image] setImage:imageTEST];



    image ist in diesem Fall die Variable vom Typ UIImageView.

    Alternativ habe ich vorher noch das hier versucht:

    Quellcode

    1. NSString *imgPfad = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:graphicFile];
    2. NSURL *imgURL = [[NSURL alloc]initWithString: @"bild123.jpg"];
    3. NSData *imgData = [[NSData alloc] initWithContentsOfURL:imgURL];
    4. UIImage *img = [[UIImage alloc] initWithData:imgData];


    graphicFile ist hierbei ein String (der Dateiname als String).

    Hat aber auch nicht geklappt! Grrr!

    Bitte um Hilfe
  • Das hat sich inzwischen wieder geändert! Ich habe nur noch ein OUTLET!

    Habe inzwischen auch eine Methode geschrieben:

    - (void) changeImage: (UIImage*)aImage{
    [grafik setImage:aImage];
    }

    Aufruf:
    UIImage *imageTEST = [UIImage imageNamed: @"fit010.jpg"];
    [myDetailViewController changeImage:imageTEST];


    Bringt aber auch nix!!
  • Von Außen würde ich es so versuchen:

    In der Außenklasse . .

    DetailViewController *myDetailViewController;

    IBOutlet DetailViewController *myDetailViewController; //Dieses Outlet im IB mit DetailViewController verbinden

    Aufruf:
    UIImage *imageTEST = [UIImage imageNamed: @"fit010.jpg"];
    [myDetailViewController changeImage:imageTEST];
  • Vivid schrieb:

    Das hat sich inzwischen wieder geändert! Ich habe nur noch ein OUTLET!

    Habe inzwischen auch eine Methode geschrieben:

    - (void) changeImage: (UIImage*)aImage{
    [grafik setImage:aImage];
    }

    Aufruf:
    UIImage *imageTEST = [UIImage imageNamed: @"fit010.jpg"];
    [myDetailViewController changeImage:imageTEST];


    Bringt aber auch nix!!

    a) Probier mal code-tag, im Editor der Knopf mit der Raute.
    und b) Mache ein paar Logs, setze den Debugger ein, was immer Du zum Stochern findest, und schaue einfach nach.
    Schon mal

    Quellcode

    1. [self.grafik setImage:anImage];
    ausprobiert?
    I would be embarrassed if they did not spy on me.
  • Vivid schrieb:

    So... also zurück...

    detailView ist scheinbar doch nicht NIL! Aber meine UIImageView in meinem ViewController ist NIL. Und ich kann mir nicht erklären warum.

    Hier mal meine Property und die Variable.

    Quellcode

    1. IBOutlet UIImageView *grafik;@property(retain,nonatomic) IBOutlet UIImageView *grafik;

    Würde ich so schreiben:

    UIImageView *grafik;

    @property(nonatomic, retain) IBOutlet UIImageView *grafik;

    Glaube sonst hast du 2 Outlets aber keine Variable ?
  • Also sorry nochmal... habe vorhin nur schnellantwort geklickt!!

    Ich merke, die Nerven liegen langsam blank. Nicht nur bei mir. :P

    Hier ist mein HeaderFile

    Quellcode

    1. #import <UIKit/UIKit.h>@interface DetailView : UIViewController {
    2. IBOutlet UIImageView *grafik;
    3. }
    4. @property (nonatomic,retain) IBOutlet UIImageView *grafik;
    5. @end


    Was mir vorhin aufgefallen ist: Ich habe ein mal eine Methode changeImage geschrieben und dort grafik geprüft. Grafik war in der Methode nil. In der ViewDidLoad war grafik aber noch nicht nil. Womit kann das zusammenhängen. Hab auch mal testweise im IB statisch ein Bild gesetzt. Gleicher Fehler. Scheinbar verliert er die Referenz auf das IBOutlet. Egal ob ich grafik oder self.grafik mache.
  • Vivid schrieb:


    Also sorry nochmal... habe vorhin nur schnellantwort geklickt!!

    Ich merke, die Nerven liegen langsam blank. Nicht nur bei mir. :P

    Hier ist mein HeaderFile

    Quellcode

    1. #import @interface DetailView : UIViewController {
    2. IBOutlet UIImageView *grafik;
    3. }
    4. @property (nonatomic,retain) IBOutlet UIImageView *grafik;
    5. @end


    Was mir vorhin aufgefallen ist: Ich habe ein mal eine Methode changeImage geschrieben und dort grafik geprüft. Grafik war in der Methode nil. In der ViewDidLoad war grafik aber noch nicht nil. Womit kann das zusammenhängen. Hab auch mal testweise im IB statisch ein Bild gesetzt. Gleicher Fehler. Scheinbar verliert er die Referenz auf das IBOutlet. Egal ob ich grafik oder self.grafik mache.



    Lass doch mal das IBOutlet bei der Var. weg, nur in der @propertyzeile dekl. das IBOutlet ?
  • In der Methode ist es immer noch nil

    hab es hiermit getestet:

    Quellcode

    1. - (void) changeImage:(UIImage*)aImage{
    2. if (self.grafik == nil) {
    3. NSLog(@"grafik = nil!");
    4. }
    5. }


    hab ich direkt nach dem erstellen aufgerufen

    Quellcode

    1. UIImage *imageTEST = [UIImage imageNamed: @"fit010.jpg"];
    2. DetailViewController *myDetailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
    3. [myDetailViewController changeImage:imageTEST];
  • Vivid schrieb:

    In der Methode ist es immer noch nil

    hab es hiermit getestet:

    Quellcode

    1. - (void) changeImage:(UIImage*)aImage{
    2. if (self.grafik == nil) {
    3. NSLog(@"grafik = nil!");
    4. }
    5. }


    hab ich direkt nach dem erstellen aufgerufen

    Quellcode

    1. UIImage *imageTEST = [UIImage imageNamed: @"fit010.jpg"];
    2. DetailViewController *myDetailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
    3. [myDetailViewController changeImage:imageTEST];





    Wenn die Methode chanceImage wirklich so aussieht, solltest du vor der Prüfung grafik auch aImage zuweisen, oder ?
  • Danke für deine Hilfe!

    1.) grafik ist ja nicht das Bild, sondern nur die VIEW (UiImageview). Die darf also nicht nil sein. Auch nicht wenn kein Bild drin ist. Wurde ja mit IB angelegt.
    2.) Ich habe das Bild testweise statisch im IB gesetzt. Daher müsste sowohl grafik als auch das Image im UIImageView vorhanden sein. Zumindest nicht nil.

    Kann mir nur vorstellen, dass das irgendwie automatisch released wird. Es (grafik) ist ja direkt nach dem anlegen nicht mehr vorhanden. In der ViewDidLoad ist es noch da.
  • Beispiel UIIMageView

    #import <UIKit/UIKit.h>


    @interface DetailViewController : UIViewController
    {

    UIImageView *grafik;
    UIImage *bild1;
    UIImage *bild2;

    UILabel *bildName;

    }
    @property (nonatomic, retain) IBOutlet UIImageView *grafik;
    @property (nonatomic, retain) IBOutlet UILabel *bildName;
    @property (nonatomic, retain) UIImage *bild1;
    @property (nonatomic, retain) UIImage *bild2;


    -(void)bildWechsel;

    @end

    #import "DetailViewController.h"


    @implementation DetailViewController

    @synthesize grafik, bildName, bild1, bild2;

    // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
    - (void)viewDidLoad
    {
    bild1 = [UIImage imageNamed:@"Bild11"];
    bild2 = [UIImage imageNamed:@"Bild12"];
    [grafik setImage:bild1];
    [bildName setText:@"Bild 1"];
    [super viewDidLoad];
    }


    -(void)bildWechsel
    {
    if ([[bildName text] isEqualToString:@"Bild 1"])
    {
    [grafik setImage:bild2];
    [bildName setText:@"Bild 2"];
    }
    else
    {
    [grafik setImage:bild1];
    [bildName setText:@"Bild 1"];
    }
    }


    Aus dieser Klasse erfolgt der Bildwechsel !

    #import <UIKit/UIKit.h>

    @class DetailViewController;

    @interface UIImageViewAppDelegate : NSObject <UIApplicationDelegate>
    {
    UIWindow *window;
    NSTimer *zeit;

    DetailViewController *myDetailViewController;
    }

    @property (nonatomic, retain) IBOutlet UIWindow *window;
    @property (nonatomic, retain) NSTimer *zeit;
    @property (nonatomic, retain) IBOutlet DetailViewController *myDetailViewController;

    @end


    #import "UIImageViewAppDelegate.h"
    #import "DetailViewController.h"

    @implementation UIImageViewAppDelegate

    @synthesize window, myDetailViewController, zeit;



    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // Override point for customization after application launch.

    [window makeKeyAndVisible];
    [window addSubview:[myDetailViewController view]];

    if (zeit==nil)
    {
    zeit = [NSTimer scheduledTimerWithTimeInterval:1
    target:self
    selector:@selector(autoBildWechsel:)
    userInfo:nil
    repeats:YES];
    }

    [zeit fire];
    return YES;
    }

    -(void)autoBildWechsel:(NSTimer *)aTimer
    {
    [myDetailViewController bildWechsel];
    }
  • Könnte es sein, dass das UIImageView irgendwie weggeworfen wird, nachdem die instanz von DetailViewController erstellt wurde?

    Ich kann das Projekt auch mal jemandem zuschicken, wenn sich jemand erbarmt. :P Aber ich komme echt nicht weiter. Und die zeit drängt :(
  • Vivid schrieb:

    Aber ich komme echt nicht weiter. Und die zeit drängt

    Du solltest Dir vielleicht mal angewöhnen, konkreter zu Fragen und notwendige Informationen zu liefern anstatt Vermutungen anzustellen (siehe oben). Das beschleunigt den Prozess erheblich.

    Du gehst ja sicherlich auch nicht in die Autowerkstatt und sagst Mein Auto ist kaputt. Könnte es die Benzinpumpe sein? und lässt das Auto aber zu Hause stehen.
    „Meine Komplikation hatte eine Komplikation.“