выцветание изображений в iphone с ресурсов - PullRequest
0 голосов
/ 03 мая 2011

что я хочу, это затемнить первое изображение и показать следующее .. У меня есть 3 изображения в пакете ресурсов, я смог перейти от первого изображения к следующему, а затем приложения выдают ошибку в консоли ...NSInvalidArgumentException- [NSCFString objectAtIndex:]: нераспознанный селектор, отправленный экземпляру 0x5e ... ниже приведен код .. cud u парни, помогите мне.

в заголовке

UIImageView *imageViewBottom, *imageViewTop;

NSArray *imageArray; 

реализация

int topIndex = 0, prevTopIndex = 1; 
-(void)viewDidLoad
{
  imageViewBottom = [[UIImageView alloc] initWithFrame:CGRectMake(0,0,320,480)];
  [self.view addSubview:imageViewBottom]; 

  imageViewTop = [[UIImageView alloc] initWithFrame:CGRectMake(0,0,320,480)];
  [self.view addSubview:imageViewTop];

  imageArray = [NSArray arrayWithObjects:  
                  [UIImage imageNamed:@"lori.png"],
                  [UIImage imageNamed:@"miranda.png"],
                  [UIImage imageNamed:@"taylor.png"],
                  [UIImage imageNamed:@"ingrid.png"],
                  [UIImage imageNamed:@"kasey.png"], 
                  [UIImage imageNamed:@"wreckers.png"], nil];


  NSTimer *timer = [NSTimer timerWithTimeInterval:5.0 
                                              target:self 
                                            selector:@selector(onTimer) 
                                            userInfo:nil 
                                             repeats:YES];

  [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
  [timer fire];

  [super viewDidLoad];
}

-(void)onTimer
{    
  if(topIndex %2 == 0)
  {   
    [UIView animateWithDuration:5.0 animations:^    
    {
      imageViewTop.alpha = 0.0;
    }]; 
    imageViewTop.image = [imageArray objectAtIndex:prevTopIndex];

    imageViewBottom.image = [imageArray objectAtIndex:topIndex];
  }
  else
  {
    [UIView animateWithDuration:5.0 animations:^       
    {     
      imageViewTop.alpha = 1.0;
    }];        
    imageViewTop.image = [imageArray objectAtIndex:topIndex];

    imageViewBottom.image = [imageArray objectAtIndex:prevTopIndex];
  } 
  prevTopIndex = topIndex; 

  if(topIndex == [imageArray count] - 1)
  {
    topIndex = 0; 
  }
  else
  {
    topIndex++; 
  }
}

1 Ответ

2 голосов
/ 03 мая 2011

[NSArray arrayWithObjects:...] автоматически выпущен, поэтому при попытке доступа вы собираете мусор

вам нужно

imageArray = [[NSArray arrayWithObjects:  
                  [UIImage imageNamed:@"lori.png"],
                  [UIImage imageNamed:@"miranda.png"],
                  [UIImage imageNamed:@"taylor.png"],
                  [UIImage imageNamed:@"ingrid.png"],
                  [UIImage imageNamed:@"kasey.png"], 
                  [UIImage imageNamed:@"wreckers.png"], nil] retain];

не забудьте освободить в сделке

-(void)dealloc
{
[imageArray release];
[super dealloc];
}

[Изменить] О таймере и комментариях

Попробуйте использовать

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:5.0 
                                              target:self 
                                            selector:@selector(onTimer:) 
                                            userInfo:nil 
                                             repeats:YES];

Вместо

NSTimer *timer = [NSTimer timerWithTimeInterval:5.0 
                                              target:self 
                                            selector:@selector(onTimer) 
                                            userInfo:nil 
                                             repeats:YES];

  [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
  [timer fire];

У меня такое чувство, что твоя конструкция как-то блокирует нить. Я могу ошибаться.

-(void)onTimer:(NSTimer *)aTimer
{
...
}

Также является предпочтительной подписью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...