2014-02-10 5 views
0

Я пытаюсь отобразить 34 последовательных изображения в контейнере UIImageView при нажатии кнопки.Xcode: изображение UIImageView не обновляется

- (IBAction)buttonPressed { 
    [self updateUI:(0)]; 
} 

-(void)updateUI:(int)yesser{ 

    //if GO is pressed 

     //display 34 images MG_8842.PNG -> MG_8875.PNG stored in Supporting Files 
     for(int j = 0;j<34;j++){ 
      NSString *newPhoto =[NSString stringWithFormat:@"MG_88%i.PNG",42+j]; 
      NSLog(@"%@",newPhoto); 
      sleep(1); 
      [self setNextImage:newPhoto]; 
     } 
} 

-(void)setNextImage:(NSString*)nextImage{ 

    [ball performSelectorOnMainThread:@selector(setImage:) withObject: [UIImage imageNamed:nextImage] waitUntilDone:YES]; 

} 

Однако изображения не обновляются. Когда весь код заканчивается и возвращается, отображается первое изображение.

Я попробовал следующее:
1) Продукт> Clean
2) Заново приложение.
3) Проверено все чувствительность к регистру.
4) Протестировано количество методов для установки изображений UIImageView.
5) Проверено, если сработало 34 статических значения NSString вместо изменения одной NSString каждый раз
6) Удалены и добавлены изображения в папку поддерживающих файлов.
7) Переименовано все изображения и обновленный код для соответствия.
8) Выключено AutoLayout.

Любая помощь была бы высоко оценена.

Спасибо, Роб

+0

Я могу только представить себе, что с помощью 'сна () 'вызовет у вас больше проблем, чем помощь. Не могли бы вы просто использовать 'NSTimer' и планировать его для вызова' setNextImage: 'каждую секунду? – SpacePyro

+0

Показать свой метод setImage –

+0

У меня есть подозрительное подозрение, что вы пытаетесь реплицировать анимацию с помощью sleep .. – amar

ответ

0

Я думаю, что вы вообще хотите, чтобы избежать использования sleep() если вы пытаетесь обновить пользовательский интерфейс. Когда вы вызываете сон, вы говорите основному потоку в течение определенного периода времени. Поскольку пользовательский интерфейс выполняется в основном потоке, я могу представить, что, поскольку он пытается обновить его, ваш вызов sleep() не позволяет полностью обновить его. Следовательно, почему вы не видите никаких обновлений до самого конца.

Как я уже говорил в своем комментарии, так как вы хотите обновить то, что я себе представляю, это UIImageView, вам следует рассмотреть возможность использования NSTimer. Этот класс удобен для планирования периодического обновления на определенный промежуток времени. В этом случае, мы хотим, чтобы UIImageView начать обновление минуты buttonPressed называется, так что мы могли бы сделать что-то вроде этого:

- (IBAction)buttonPressed:(id)sender { 
    [self updateUI]; 
} 

- (void)updateUI{ 
    // If you wanted to keep track of this NSTimer, you could hold onto it 
    // via a property. 
    // `fire` basically tells the timer to begin executing what's been set 
    // for the selector. 
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(setNextImage:) userInfo:nil repeat:YES]; 
    [timer fire]; 
} 

- (void)setNextImage { 
     // Here is where your logic would change. You would need some kind of way 
     // of figuring out which image to display. You could have an NSInteger 
     // property store how many times the method gets called and then 
     // determine which image to show from there, for example. 

     // Assume that with your new logic, you have acquired the image you 
     // want to display. 
     UIImage *image = imageToDisplay; 

     // Also assuming here that (based on your code), `ball` is the 
     // name of your UIImageView. 
     ball.image = imageToDisplay; 
} 

Чтобы уничтожить таймер, просто вызовите [timer invalidate].

+0

Спасибо вам большое. Я добавил свою логику для выбора следующего изображения и удалил параметр: id (отправитель) из метода buttonPressed. Последнее вызвало недопустимую проблему параметра во время выполнения, не совсем уверен, почему, но удаление исправило ошибку. Теперь мой псевдо-анимационный код (@amar) работает! – User1234231

-1

Попробуйте

- (IBAction)buttonPressed { 
    [self updateUI:(0)]; 
} 

-(void)updateUI:(int)yesser{ 

//if GO is pressed 

    //display 34 images MG_8842.PNG -> MG_8875.PNG stored in Supporting Files 
    for(int j = 0;j<34;j++){ 
     NSString *newPhoto =[NSString stringWithFormat:@"MG_88%i",42+j]; 
     NSLog(@"%@",newPhoto); 
     sleep(1); 
     [self setNextImage:newPhoto]; 
    } 
} 

-(void)setNextImage:(NSString*)nextImage{ 

    [ball performSelectorOnMainThread:@selector(setImage:) withObject: [UIImage imageNamed:nextImage] waitUntilDone:YES]; 
    UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 10, 100, 50)]; 
    imgView.image = [UIImage imageNamed:[NSString stringWithFormat: @"%@.png", nextImage]]; 
    [self.view addSubview:imgView]; 
} 
+2

Это добавляет новый 'UIImageView' в родительский вид при каждом вызове' setNextImage: '. Я не думаю, что это обязательно устраняет проблему. – SpacePyro

+2

Это приведет к новой проблеме, а не решению текущей. –

0

UIImageView имеет возможность для анимации изображений, попробуйте это

imageView.animationImages = [NSArray arrayWithObjects: 
             [UIImage imageNamed:@"progress-1"], 
             [UIImage imageNamed:@"progress-2"], 
             [UIImage imageNamed:@"progress-3"], 
             [UIImage imageNamed:@"progress-4"], nil]; 
imageView.animationDuration = 2.0f; 
imageView.animationRepeatCount = 1; 
[imageView startAnimating]; 

вы должны переименовать изображения в последовательном порядке и называем это на нажатие кнопки ..

Смежные вопросы