2014-02-05 4 views
1

Я пытаюсь последовательно отображать набор чисел на UILabel.Как скрыть текст от UILabel в IOS

Например: У меня есть массив с 5 номерами, и каждый раз, когда я хочу один номер из массива, который будет отображаться в течение 2 секунд на экране, а затем исчезает, а затем следующий номер ...

Это то, что Я сделал это до сих пор, но это не совсем то, что я хочу. В приведенном ниже коде просто отображается последнее число в массиве в течение 2 секунд, а затем исчезает.

- (void)viewDidLoad 
{ 
    [super viewDidLoad];  

    NSMutableArray* myArray = [NSMutableArray array]; 
    for (int i=0; i<5; i++) { 
      NSNumber *temp; 
      temp = [myArray objectAtIndex:i]; 
      [self displayNumber:temp]; 

      [myLabel setHidden:NO]; 
    } 
} 

-(void) displayNumber: (NSNumber *) myNumber{ 
    myLabel.text = [NSString stringWithFormat:@"%@", myNumber]; 
    NSTimer *myTimer; 
    myTimer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(hideLabel) userInfo:Nil repeats:NO]; 

} 

-(void) hideLabel{ 
    [myLabel setHidden:YES]; 
} 

Я думал о наличии 5 функций и каждый из них вызывается последовательно через 2 секунды, но это очень неэффективно.

Есть ли другие способы, которыми я могу это сделать?

+0

Что не работает с кодом вы сейчас имеете? Вы могли бы просто использовать 'sleep (2)' – Gad

+0

Ну, код, который у меня сейчас, просто отображает последнее число в массиве в течение 2 секунд, а затем исчезает. – user2771150

+0

вызов сна (2) в основной теме блокирует ваше приложение и все взаимодействие в течение 2 секунд – rist

ответ

1

Изменить этот метод

Надеется, что это будет работаю для вас, что вы хотите

1) Определение

NSMutableArray* myArray , int repeatCount; and NSTimer *myTimer in .h file and set its property; 

2)

-(void)viewDidLoad 
{ 
    [super viewDidLoad];  
    //This will initialize your timer 
    myTimer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(showLabel) userInfo:Nil repeats:NO]; 
    //This will trigger your timer 
    [myTimer fire]; 
    //Your timer will run in a loop 
    [[NSRunLoop currentRunLoop] addTimer:myTimer forMode:NSDefaultRunLoopMode]; 

    myArray = [NSMutableArray array]; 
} 

-(void) displayNumber: (NSNumber *) myNumber{ 
    myLabel.text = [NSString stringWithFormat:@"%@", myNumber]; 
} 

-(void) showLabel{   
    if(repeatCount >= [myArray count]) 
    { 
     repeatCount = 0; 
    } 
    NSNumber *temp = [myArray objectAtIndex:repeatCount]; 
    repeatCount ++; 
    [self displayNumber:temp]; 
    [myLabel setHidden:NO]; 
} 
+0

Что делает последняя строка? – user2771150

+0

Я изменил свой ответ – Siddh

+0

извините, не работает. – user2771150

0

Я думаю, что вы можете использовать таймер со счетчиком.

Создать 3 свойства:

@property (nonatomic, assign) int counter; 
@property (nonatomic, strong) NSArray *array; 
@property (nonatomic, strong) NSTimer *timer; 

Установите их в viewDidLoad: и начать таймер (с повторением): ярлык

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    _counter = 0; 
    _array = @[@0, @1, @2, @3, @4, @5]; 
    _timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(nextLabel) userInfo:Nil repeats:YES]; 
} 

Update:

- (void)nextLabel{ 
    if (_counter == [_array count]) { 
     //stop in the end of array 
     [_timer invalidate]; 
     return; 
    } 
    [_label setText:[NSString stringWithFormat:@"%@", _array[_counter]]]; 
    _counter++; 
} 
+0

Я думал об этом, он слишком эффективен, если в моем массиве есть 100 элементов. – user2771150

+0

Хм, и что не так с этим решением?Просто создайте _array со 100 элементами и все будет хорошо – kaspartus

+0

@ user2771150 Hm, вы хотите показать элемент массива в течение 2 секунд, затем спрячьте его на 2 секунды, а затем покажете следующее? – kaspartus

0

Попробуйте это:

// Initialize the timer when you want to change the first number 
[NSTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(changeNumber:) userInfo:@{@"currentNumber" : [NSNumber numberWithInt:0]} repeats:NO]; 

-(void)changeNumber:(NSTimer *)timer 
{ 
    NSDictionary * dictionary = [timer userInfo]; 
    int number = [(NSNumber *)[dictionary objectForKey:@"currentNumber"] integerValue]; 
    if (number < [numbersArray count]) 
    { 
     myLabel.text = [NSString stringWithFormat:@"%@", [numbersArray objectAtIndex:number]]; 
     [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(changeNumber:) userInfo:@{@"currentNumber" : [NSNumber numberWithInt:number + 1]} repeats:NO]; 
    } 
} 
+0

Это не работает, если числа в массиве не находятся в последовательном порядке. Например, элементы в массиве могут быть [2,99,55,1,32]. – user2771150

+0

Обновлен мой ответ. 'numbersArray' - это массив, содержащий числа, которые вы хотите отобразить. – Gad

0

Пропускают массив с экземплярами NSNumber по приведенному ниже методу

- (void)updateLabelWithArray:(NSMutableArray *)array 
{ 
    if ([array count] != 0) 
    { 
     myLabel.text = [NSString stringWithFormat:@"%@", [array firstObject]]; 
     [array removeObjectAtIndex:0]; 
     [self performSelector:@selector(updateLabelWithArray:) 
        withObject:array 
        afterDelay:2.0f]; 
    } 
} 

Это должно сделать.

0

попробовать эту надежду, что это помогает U .. :)

- (void)viewDidLoad 
    { 
    [super viewDidLoad]; 
// Do any additional setup after loading the view, typically from a nib. 
    [super viewDidLoad]; 

     myArray = [[NSMutableArray alloc]initWithObjects:[NSNumber numberWithInt:3],[NSNumber numberWithInt:5],[NSNumber numberWithInt:6],[NSNumber numberWithInt:7],[NSNumber numberWithInt:10], nil]; //your array contains any number you want 

    index = 0; //showing the numbers from 0th index to last indx 
    [self.myLabel setHidden:NO]; 

    [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(DisplayFortwoSec) userInfo:nil repeats:YES];//call the method reguraly for 2 sec 
    } 

    - (void)DisplayFortwoSec 
    { 
     [self.myLabel setHidden:YES]; 
     if(index == ([myArray count] - 1)) 
     index = 0;//other stuffs to come out of loop like invalidating the timer 
     [self.myLabel setHidden:NO]; 
     NSNumber *num = [myArray objectAtIndex:index]; 
     NSString *strNum = [num stringValue]; 
     self.myLabel.text = strNum; 
     [self.myLabel setHidden:NO]; 
     index ++; 

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