2013-10-26 2 views
1

ВсеIOS - Использование NSTimer, обновление UIImageView Просто в первый раз

Когда я с помощью NSTimer, чтобы завершить свою задачу, я встречаю некоторые проблемы. Мне нужна помощь, спасибо.

Вот проблема.

Когда я использую NSTimer для отображения анимации в UIImageView. но UIImageView просто обновляется в первый раз, когда я запускаю код в своих iphone4, используя xcode. когда UIImageView появляется снова, он не обновляет содержимое изображения. Я проверил журнал, таймер вызывается каждый раз, и код закрывается, когда он запускается.

NSTimer:

if (networkStatusTimer == nil) { 
     networkStatusTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(getcurrentNetworkDelayStatus) userInfo:nil repeats:YES]; 

networkStatusImageView Initialization часть:

- (UIImageView *)networkStatusImageView 
{ 
    if (nil == _networkStatusImageView) { 
     CGRect rect = CGRectMake(246, 12, 24, 8); 
     _networkStatusImageView = [[UIImageView alloc]initWithFrame:rect]; 
     _networkStatusImageView.contentMode = UIViewContentModeRight | UIViewContentModeTop; 

     UIImageView *img1 = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"talk_icon_redsolid_1X"]]; 
     UIImageView *img2 = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"talk_icon_redhollow_1x"]]; 
     UIImageView *img3 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"talk_icon_whitehollow_1x"]]; 

     img2.left = img1.right; 
     img3.left = img2.right; 

     [_networkStatusImageView setNeedsDisplay]; 
     [_networkStatusImageView addSubview:img1]; 
     [_networkStatusImageView addSubview:img2]; 
     [_networkStatusImageView addSubview:img3]; 
    } 
    return _networkStatusImageView; 
} 

Селектор Код:

- (void) getcurrentNetworkDelayStatus { 
    currentNetworkDelayTime = 0; 
    [_networkStatusImageView removeAllSubviews]; 
    UIImageView *img1 = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"talk_icon_redhollow_1x"]]; 
    UIImageView *img2 = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"talk_icon_redhollow_1x"]]; 
    UIImageView *img3 = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"talk_icon_redhollow_1x"]]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
    if (currentNetworkDelayTime == 0) { 
     if (currentISRed) { 
      img1.image = [UIImage imageNamed:@"talk_icon_redhollow_1x"]; 
      img2.image = [UIImage imageNamed:@"talk_icon_redhollow_1x"]; 
      img3.image = [UIImage imageNamed:@"talk_icon_redhollow_1x"]; 
     } else { // 显示红色实心 
      img1.image = [UIImage imageNamed:@"talk_icon_redsolid_1X"]; 
      img2.image = [UIImage imageNamed:@"talk_icon_redsolid_1X"]; 
      img3.image = [UIImage imageNamed:@"talk_icon_redsolid_1X"]; 
     } 
     currentISRed = !currentISRed; 
    } else if(currentNetworkDelayTime > 0 && currentNetworkDelayTime <= 500){ 
     img1 = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"talk_icon_greensolid1X"]]; 
     img2 = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"talk_icon_greensolid1X"]]; 
     img3 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"talk_icon_greensolid1X"]]; 
    } else if(currentNetworkDelayTime > 500 && currentNetworkDelayTime <= 3000){ 
     img1 = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"talk_icon_greensolid1X"]]; 
     img2 = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"talk_icon_greensolid1X"]]; 
     img3 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"talk_icon_greenhollow_1x"]]; 
    } else if (currentNetworkDelayTime > 3000){ 
     img1 = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"talk_icon_greensolid1X"]]; 
     img2 = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"talk_icon_greenhollow_1x"]]; 
     img3 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"talk_icon_greenhollow_1x"]]; 
    } 

    img2.left = img1.right; 
    img3.left = img2.right; 

    [img1 setNeedsDisplay]; 
    [img2 setNeedsDisplay]; 
    [img3 setNeedsDisplay]; 
    [_networkStatusImageView setNeedsDisplay]; 

    [_networkStatusImageView addSubview:img1]; 
    [_networkStatusImageView addSubview:img2]; 
    [_networkStatusImageView addSubview:img3]; 
    }); 
} 
+0

setNeedsDisplay звонки не нужны –

+0

Вероятно, ваш _networkStatusImageView равен нулю –

+0

lastly: почему dispatch_async? –

ответ

0

Каждый раз, когда функция вызывается, вы установите currentNetworkDelayTime 0. С КОТОРЫМИ означает, что только:

if (currentNetworkDelayTime == 0) { 
    if (currentISRed) { 
     img1.image = [UIImage imageNamed:@"talk_icon_redhollow_1x"]; 
     img2.image = [UIImage imageNamed:@"talk_icon_redhollow_1x"]; 
     img3.image = [UIImage imageNamed:@"talk_icon_redhollow_1x"]; 
    } else { // 显示红色实心 
     img1.image = [UIImage imageNamed:@"talk_icon_redsolid_1X"]; 
     img2.image = [UIImage imageNamed:@"talk_icon_redsolid_1X"]; 
     img3.image = [UIImage imageNamed:@"talk_icon_redsolid_1X"]; 
    } 
    currentISRed = !currentISRed; 
} 

Получает имя. Так что вам нужно изменить строку currentNetworkDelayTime = 0; к currentNetworkDelayTime++;

И вы не должны добавлять изображения к текущему UIView каждый раз, просто создать их один раз в отл. viewDidLoad и сделать для них глобальную переменную.

После того, как вы сделали это, добавьте этот метод, чтобы сделать ваш код короче:

-(void)changeView:(NSArray *)strArray { 
    NSArray *viewArray = [[NSArray alloc] initWithObjects:view1, view2, view3, nil]; 
    for (int a = 0; 0 < 3; a++) { 
     UIImageView *img = viewArray[a]; 
     img.image = [UIImage imageNamed:strArray[a]]; 
     [img setNeedsDisplay]; // If you really want to do this. 
    } 
} 

И назвать это как этого

[self changeView:[[NSArray alloc] initWithObjects:@"Image_for_img1.suffix", @"Image_for_img2.suffix", @"Image_for_img3.suffix", nil]]; 
+0

Спасибо за помощь ур, currentNetworkDelayTime установлен мной для проверки кода ниже, я знаю это. Я попробовал ур ответить, как метод changeView, но imageView все еще не обновлен. –

+0

Вы создали объекты? Ex. in viewDidLoad, img = [[UIIMageView alloc] init]; или в раскадровке. – Arbitur

+0

И теперь я вижу, что вы не вводите суффикс для изображения «.jpg». – Arbitur

0

Я проверил ваш код на моем компьютере, и я получил его за работой.

В заголовке файла:

@property(nonatomic,strong)UIImageView *networkStatusImageView; 

В viewDidLoad:

[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(test) userInfo:Nil repeats:YES]; 
self.networkStatusImageView = [self networkStatusImageView]; 
[self.view addSubview:self.networkStatusImageView]; 

функции networkStatusImageView:

- (UIImageView *)networkStatusImageView 
{ 
if (nil == _networkStatusImageView) { 
    CGRect rect = CGRectMake(0, 0, 300, 50); 
    _networkStatusImageView = [[UIImageView alloc]initWithFrame:rect]; 
    _networkStatusImageView.contentMode = UIViewContentModeRight | UIViewContentModeTop; 

    for (int a = 0; a < 3; a++) { 
    UIImageView *img = [[UIImageView alloc] initWithFrame:CGRectMake(100*a, 0, 100, 50)]; 
    [img setBackgroundColor:[UIColor blueColor]]; 
    [_networkStatusImageView addSubview:img]; 
} 
} 
return _networkStatusImageView; 
} 

тест функции:

-(void)test { 
int currentNetworkDelayTime = 0; 
BOOL currentISRed = NO; 
NSArray *subViews = [self.networkStatusImageView subviews]; 
UIImageView *img1 = [subViews objectAtIndex:0]; 
UIImageView *img2 = [subViews objectAtIndex:1]; 
UIImageView *img3 = [subViews objectAtIndex:2]; 
if (currentNetworkDelayTime == 0) { 
    if (currentISRed) { 
     [img1 setBackgroundColor:[UIColor redColor]]; 
     [img2 setBackgroundColor:[UIColor redColor]]; 
     [img3 setBackgroundColor:[UIColor redColor]]; 
    } else { 
     [img1 setBackgroundColor:[UIColor greenColor]]; 
     [img2 setBackgroundColor:[UIColor greenColor]]; 
     [img3 setBackgroundColor:[UIColor greenColor]]; 
    } 
} 
} 

Я использовал цвет фона вместо изображений, потому что я не хотел делать изображения для тестирования этого, просто измените его на setImage:, и он должен работать.

+0

Arbitur, Спасибо за вашу помощь , Возможно, что-то другое. Я не размещал представление в UIViewController. Я сделал индивидуальный UIView и поместил в него эти изображения. –

+0

@interface RHCVoIPCardView: UIButton –

+0

Он не должен находиться внутри только viewDidLoad, он также может быть внутри initWithFrame :. – Arbitur

-1

я решил мою проблему, решение ниже:

Я тщательно проверил эту проблему и создать три UIImage поле вара.ниже:

@property (nonatomic, weak) UIImage *imgFile1; 
@property (nonatomic, weak) UIImage *imgFile2; 
@property (nonatomic, weak) UIImage *imgFile3; 

и свяжите их с ресурсом изображения xib.

Эта реализация функции не очень хорошая, и я планирую повторно реализовать в следующей версии, есть слишком много выделения памяти и выпуска, некоторые выделения и освобождение могут быть удалены, чтобы сделать код более эффективным.

Спасибо всем, что помогли мне.

+0

кажется эзотерическим для меня. Я боюсь .. не выпускает материал, влияющий на пользовательский интерфейс :) Это должно быть что-то еще –

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