Domanda

Continuo a ricevere un errore di cattiva accesso esc e penso che abbia qualcosa a che fare con il mio UIPickerView perché questo è quando l'applicazione si blocca. Tutto funziona bene fino a quando faccio una scelta 9 dal UIPickerView. Ogni singola volta l'applicazione si blocca sulla scelta 9. Tutte le idee?

- (void)viewDidLoad {
        [super viewDidLoad];



     list = [[NSMutableArray alloc] init];
     [list addObject:@"Anvil"];
     [list addObject:@"Apple"];
     [list addObject:@"Arrow"];
     [list addObject:@"Baby"];
     [list addObject:@"Basketball"];
     [list addObject:@"Beehive"];
     [list addObject:@"Blimp"];
     [list addObject:@"Bomb"];
     [list addObject:@"Bungee Jumper"];
     [list addObject:@"Cactus"];
     [list addObject:@"Cake"];
     [list addObject:@"Car"];
     [list addObject:@"Caterpillar"];
     [list addObject:@"Couch"];
     [list addObject:@"Dennis"];

        anvil = [UIImage imageNamed:@"anvil.png"];
     apple = [UIImage imageNamed:@"apple.png"];
     arrow = [UIImage imageNamed:@"arrow.png"];
     baby = [UIImage imageNamed:@"baby.png"];
     basketball = [UIImage imageNamed:@"basketball.png"];
     beehive = [UIImage imageNamed:@"beehive.png"];
     blimp = [UIImage imageNamed:@"blimp.png"];
     bomb = [UIImage imageNamed:@"bomb.png"];
     bungeejumper = [UIImage imageNamed:@"bungeejumper.png"];
     cactus = [UIImage imageNamed:@"cactus.png"];
     cake = [UIImage imageNamed:@"cake.png"];
     car = [UIImage imageNamed:@"car.png"];
     caterpillar = [UIImage imageNamed:@"caterpillar.png"];
     couch = [UIImage imageNamed:@"couch.png"];
     dennis = [UIImage imageNamed:@"dennis.png"];
    }

    -(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)thePickerView{
     return 1;
    }

    -(NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent:(NSInteger)component{

     return [list count];
    }

    -(NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{

     return [list objectAtIndex:row];
    }

    - (void)pickerView:(UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {

     if([[list objectAtIndex:row] isEqual:@"Anvil"]) {
      [object setImage:anvil];
     }
     else if([[list objectAtIndex:row] isEqual:@"Apple"]) {
      [object setImage:apple];
     }
     else if([[list objectAtIndex:row] isEqual:@"Arrow"]) {
      [object setImage:arrow];
     }
     else if([[list objectAtIndex:row] isEqual:@"Baby"]) {
      [object setImage:baby];
     }
     else if([[list objectAtIndex:row] isEqual:@"Basketball"]) {
      [object setImage:basketball];
     }
     else if([[list objectAtIndex:row] isEqual:@"Beehive"]) {
      [object setImage:beehive];
     }
     else if([[list objectAtIndex:row] isEqual:@"Blimp"]) {
      [object setImage:blimp];
     }
     else if([[list objectAtIndex:row] isEqual:@"Bomb"]) {
      [object setImage:bomb];
     }
     else if([[list objectAtIndex:row] isEqual:@"Bungee Jumper"]) {
      [object setImage:bungeejumper];
     }
     else if([[list objectAtIndex:row] isEqual:@"Cactus"]) {
      [object setImage:cactus];
     }
     else if([[list objectAtIndex:row] isEqual:@"Cake"]) {
      [object setImage:cake];
     }
     else if([[list objectAtIndex:row] isEqual:@"Car"]) {
      [object setImage:car];
     }
     else if([[list objectAtIndex:row] isEqual:@"Caterpillar"]) {
      [object setImage:caterpillar];
     }
     else if([[list objectAtIndex:row] isEqual:@"Couch"]) {
      [object setImage:couch];
     }
     else if([[list objectAtIndex:row] isEqual:@"Dennis"]) {
      [object setImage:dennis];
     }
    }

- (void)dealloc {
 [list release];
    [super dealloc];
 [animation release];
}
È stato utile?

Soluzione

Non stai mantenendo i tuoi UIImages in modo che siano in fase di autoreleased. Dopo ogni chiamata imageNamed, hai bisogno di una vale a dire mantenere.

baby = [[UIImage imageNamed:@"baby.png"] retain];

o, se li avete dichiarati come proprietà (cioè @property (nonatomic, retain) UIImage *baby;) si può fare questo:

self.baby = [UIImage imageNamed:@"baby.png"];

che è il modo più corretto per farlo.


Tuttavia, un modo migliore di trattare con tutto questo codice potrebbe essere quella di utilizzare una serie di immagini al posto di controllo per il nome ogni volta. cioè.

imageArray = [NSArray alloc] initWithObjects:
              [UIImage imageNamed:@"Anvil.png"],
              [UIImage imageNamed:@"Apple.png"],
              [UIImage imageNamed:@"Arrow.png"],
              nil];

e poi, quando si seleziona una voce,

- (void)pickerView:(UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    [object setImage:[imagearray objectAtIndex:row]];
 }

che è un po 'più pulito;)

EDIT: Douglas ha avuto la stessa idea per ripulire il codice, mentre stavo scrivendo la seconda metà della mia risposta :)

Altri suggerimenti

è il nono oggetto l'unico con uno spazio nel nome? Non vedo come possa rompere, alla ricerca di differenze tra esso e gli altri. L'immagine non si chiama "bungee jumper.png" invece di "bungeejumper.png" è vero?

A parte: al posto di una lista di stringhe, si potrebbe avere una lista di coppie titolo dell'immagine Eg,

// ... snip ...
[self addPairWithTitle:@"Anvil" image:@"anvil.png"];
[self addPairWithTitle:@"Apple" image:@"apple.png"];

- (void) addPairWithTitle .... 
{
    // you'll need to define a MyNewPair object which retains the image and title
    [list addObject:[[MyNewPair alloc] initWithTitle:title andImage:[UIImage imageNamed:imageName]];
}

// ... snip ...

... titleForRow...
return [[list objectAtIndex:row] title];

...didSelectRow...
[object setImage:[[list objectAtIndex:row]] image];
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top