How to hide Text from UILabel in IOS - ios

I'm trying to display a set of numbers on a UILabel sequentially.
For example: I have an array with 5 numbers and each time I want one number from the array to be displayed for 2 seconds on the screen then disappear and then the next number…
This is what i have done so far, but it is not quite what I want. The code below just displays the last number in the array for 2 seconds and then disappears.
- (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];
}
I thought about having 5 functions and each gets called sequentially after 2 seconds, but that is very inefficient.
Are there any other ways I can do this?

Change this method
Hope it will works for you what you want
1) Define
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];
}

I think, that you can use timer with counter.
Create 3 properties:
#property (nonatomic, assign) int counter;
#property (nonatomic, strong) NSArray *array;
#property (nonatomic, strong) NSTimer *timer;
Set them in viewDidLoad: and start timer(with repetition):
- (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 label:
- (void)nextLabel{
if (_counter == [_array count]) {
//stop in the end of array
[_timer invalidate];
return;
}
[_label setText:[NSString stringWithFormat:#"%#", _array[_counter]]];
_counter++;
}

Pass the array with NSNumber instances to the below method
- (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];
}
}
This should do.

Try this:
// 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];
}
}

try this hope this helps 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 ++;
}

Related

Timer count throughout the game in Objective c

I am creating a game application in which I need to set timer of 2 minutes throughout the app screens in objective c.
I am creating it in viewDidLoad but it is creating a new instance every-time the view loads.
Here is the code which I am using :
#interface SomeViewController ()
{
int timerCounter;
NSTimer *timer;
}
#property (strong, nonatomic) IBOutlet UILabel *timerLbl;
#end
#implementation SomeViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self startCountdown];
}
- (void)startCountdown
{
timer = [NSTimer scheduledTimerWithTimeInterval:1
target:self
selector:#selector(countdownTimer:)
userInfo:nil
repeats:YES];
}
- (void)countdownTimer:(NSTimer *)timer
{
timerCounter--;
int minutes = timerCounter / 60;
int seconds = timerCounter % 60;
NSString *string = [NSString stringWithFormat:#"%02d", minutes];
NSString *string2 = [NSString stringWithFormat:#"%02d", seconds];
NSString *timeTotal = [string stringByAppendingString:#":"];
NSString *timeTotal2 = [timeTotal stringByAppendingString:string2];
_timerLbl.text = timeTotal2;
if (timerCounter <= 0) {
[timer invalidate];
}
}
You need to invalidate it whenever the VC deallocates
- (void)dealloc {
[timer invalidate];
}
//
The second VC may look like this
#import "ggViewController.h"
NSInteger timerCounter = 120; // declared global to hold the value
#interface ggViewController ()
{
NSTimer*timer;
}
#end
#implementation ggViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
// instead of using selector use this inline callback
timer = [NSTimer scheduledTimerWithTimeInterval:1.0 repeats:true block:^(NSTimer * timer) {
timerCounter--;
int minutes = timerCounter / 60;
int seconds = timerCounter % 60;
NSString *string = [NSString stringWithFormat:#"%02d", minutes];
NSString *string2 = [NSString stringWithFormat:#"%02d", seconds];
NSString *timeTotal = [string stringByAppendingString:#":"];
NSString *timeTotal2 = [timeTotal stringByAppendingString:string2];
_timerLbl.text = timeTotal2;
if (timerCounter <= 0) {
[timer invalidate];
}
}];
}
-(void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:animated];
[timer invalidate];
}
- (IBAction)gg:(id)sender {
[self dismissViewControllerAnimated:true completion:nil];
}
#end

Storing integers in an IBAction and passing them to another IBAction

I have a pause IBAction & a resume IBAction, both for buttons, but I have game points I collect over the duration of the game play. How can I store the different game points integer values in the pause IBAction & pass them to the resume IBAction method.
NOTE: The pause IBAction invalidates all the NSTIMERS, and the resume IBAction recreates them.
Just to assist, I found a quick solution....but I'm sure there's a cleaner method:
In the vc.h:
NSMutableArray storeVariables;
In the vc.m
int a, b, c, d;
- (void)viewDidLoad
{
[super viewDidLoad];
a=0;
b=0;
c=0;
d=0;
storeVariables = [[NSMutableArray alloc] init];
}
-(IBAction)pauseButton:(id)sender{
a=3;
b=4;
c=5;
d=6;
[storeVariables addObject:[NSNumber numberWithInt:a]];
[storeVariables addObject:[NSNumber numberWithInt:b]];
[storeVariables addObject:[NSNumber numberWithInt:c]];
[storeVariables addObject:[NSNumber numberWithInt:d]];
NSLog(#"%d, %d, %d, %d", storeVariables[0], storeVariables[1], storeVariables[2], storeVariables[3]);
}
-(IBAction)resumeButton:(id)sender{
a = [storeVariables[0]];
b = [storeVariables[1]]
c = [storeVariables[2]]
d = [storeVariables[3]]
NSLog(#"%d, %d, %d, %d", a, b, c, d);
storeVariables = [[NSMutableArray alloc] init];
}
An IBAction is code. It can't store anything. You need to save your state somewhere like an instance variable of the object that implements the IBAction
This is what worked:
.h file-
#interface ViewController2 : UIViewController{
NSMutableArray *savedScoreData;
int PlayTimer;
int timeMinute;
int bonusPts;
int enemykill;
}
.m file-
- (void)viewDidLoad {
PlayTimer = 0;
timeMinute = 0;
bonusPts = 0;
timeMinute = 0;
savedScoreData = [[NSMutableArray alloc] init];
}
- (IBAction)pauseButton:(id)sender {
NSLog(#"pause-before: %d, %d, %d,",PlayTimer,enemykill,bonusPts);
[GameTimer invalidate]; //this constantly changes the PlayTimer & timeMinute variables
[characterTimer invalidate];
[enemyTimer invalidate]; //this constantly changes the enemyKill & bonusPts variables
[_bonusImgHolder removeFromSuperview];
if([_soundEnable isEqualToString:#"YES"]){
[_player2 pause];
}
//NSLog(#"%tu",_player2.playing);
_resumeButton.hidden = NO;
_pauseButton.hidden = YES;
NSLog(#"pause-after: %d, %d, %d,",PlayTimer,enemykill,bonusPts);
//[sender num :PlayTimer];
[savedScoreData addObject:[NSNumber numberWithInteger: PlayTimer]];
[savedScoreData addObject:[NSNumber numberWithInteger: timeMinute]];
[savedScoreData addObject:[NSNumber numberWithInteger: enemykill]];
[savedScoreData addObject:[NSNumber numberWithInteger: bonusPts]];
NSLog(#"%i", [savedScoreData[0] intValue]);
NSLog(#"%d", [savedScoreData[1] intValue]);
NSLog(#"%d", [savedScoreData[2] intValue]);
NSLog(#"%d", [savedScoreData[3] intValue]);
}
- (IBAction)resumeButton:(int)pauseButton{
NSLog(#"resume-before: %d, %d, %d,",PlayTimer,enemykill,bonusPts);
PlayTimer = [savedScoreData[0] intValue];
timeMinute = [savedScoreData[1] intValue];
enemykill = [savedScoreData[2] intValue];
bonusPts = [savedScoreData[3] intValue];
NSLog(#"%d", (int)enemykill);
_resumeButton.hidden = YES;
_pauseButton.hidden = NO;
if([_soundEnable isEqualToString:#"YES"]){
[_player2 play];
}
GameTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:#selector(CollectPoints) userInfo:nil repeats:YES];
characterTimer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:#selector(Jumping) userInfo:nil repeats:YES];
enemyTimer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:#selector(enemyTravel) userInfo:nil repeats:YES];
NSLog(#"resume-after: %d, %d, %d,",PlayTimer,enemykill,bonusPts);
[savedScoreData removeAllObjects];
}

How to link a UIPickerView array to a integer property in another class iOS

I have a UIPickerView array of seconds which i would like to link to an NSTimer.
in quiz.h file
#property (strong, nonatomic) IBOutlet UIPickerView *timePicker;
i have the array in quiz.m file:
- (void)viewDidLoad {
[super viewDidLoad];
self.pickerData = #[#"1 second", #"2 seconds", #"3 seconds", #"4 seconds", #"5 seconds"];
self.timePicker.dataSource = self;
self.timePicker.delegate = self;
}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
[self.pickerData objectAtIndex:[self.timePicker selectedRowInComponent:0]];
}
and i would like to link this array of seconds to a property in the imageview.h file
#property (nonatomic, assign) int seconds;
how can i do that within the quiz.m file?
i am trying:
ImageViewController *ivc = [[ImageViewController alloc] init];
ivc.seconds = [self.timePicker selectedRowInComponent:0]; // warning displays conversion loses integer precision
what do i add in ivc.seconds to link it to the picker array and get the number seconds in each row when selected?
i want to link the seconds to a NSTimer.
[NSTimer scheduledTimerWithTimeInterval:self.seconds target:self selector:#selector(timeout)
userInfo:nil repeats:NO];
timeout method pops to rootview
make self.pickerData = #[#"1", #"2", #"3", #"4", #"5"]; and in picker methods,
- (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
int value = [[self.pickerData objectAtIndex:row] intValue];
NSString *secondString = (value > 1) ? #"seconds" : #"second"
NSString *title = [NSString stringWithFormat:#"%# %#", [self.pickerData objectAtIndex:row], secondString];
return title;
}
and on creating
NSInteger row = [self.timePicker selectedRowInComponent:0];
ImageViewController *ivc = [[ImageViewController alloc] init];
ivc.seconds = [[self.pickerData objectAtIndex:row] intValue];
to show the count down timer, set up tim er first
timer = [NSTimer scheduledTimerWithTimeInterval: 1.0 target:self selector:#selector(setTimeToLabel) userInfo:nil repeats: YES];
then in setTimeToLabel method
-(void) setTimeToLabel
{
if (self.seconds != 0) {
self.timeLabel.text = [NSString stringWithFormat:#"%d", self.seconds];
self.seconds = self.seconds - 1;
} else {
[timer invalidate];
}
}

NSMutableArray returns empty

I am writing a simple program that, I display a number from array 1 on a label and then move the number to array 2. However, the array keeps returning empty.
Here's my code.
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self firstArrayInit];
[self secondArrayInit];
[self tranferA1toA2];
}
-(NSMutableArray *) firstArrayInit{
self.originalArray = [NSMutableArray array];
for (int i=0; i<16; i++) {
[self.originalArray addObject:[NSNumber numberWithInteger:i]];
}
return self.originalArray;
}
-(NSMutableArray *)secondArrayInit{
self.secondArray = [NSMutableArray array];
return self.secondArray;
}
-(void) tranferA1toA2{
self.mytimer = [NSTimer scheduledTimerWithTimeInterval:2
target:self
selector:#selector(displayNumber)
userInfo:nil
repeats:YES];
}
-(NSMutableArray *)addToSecondArray:(int)myNumber{
[self.secondArray addObject:[self.originalArray objectAtIndex:myNumber]];
return self.secondArray;
}
-(void) displayNumber{
static int num=0;
if (num < level){
myLabel.text = [NSString stringWithFormat:#"%#", [self.originalArray objectAtIndex:num]];
[self addToSecondArray:num];
}
else{
[self.mytimer invalidate];
[myLabel setText:#""];
}
num++;
}
I've tried printing out the values in array 2 from displayNumber and it works. But, outside the function the array is empty.
Your code works as it is supposed to. The problem is that you check the array too early, even before the timer is fired for the first time. Check the array after the timer is invalidated

How to get a function to pause until the NSTimer selector is finished?

I have an NSTimer in another function but I want to be able to wait for the NSTimer to become invalidated before continuing on with the code is there a way to do this?
- (IBAction)addLifePoints:(UIButton *)sender
{
[[ARCHDuelCalculator sharedARCHDuelCalculator] setLifePointDelta:[NSNumber numberWithInt: [self.hiddenTextField.text intValue]]];
[[ARCHDuelCalculator sharedARCHDuelCalculator] setAddOrSubstract: YES];
[[ARCHDuelCalculator sharedARCHDuelCalculator] applyingDeltaToLifePointsByDelta];
// This will animate the life points
animationTimer = [NSTimer scheduledTimerWithTimeInterval:.01 target:self selector:#selector(animateLifePoints) userInfo:nil repeats:YES];
// This is where we bring it back to the view controller
self.duelistOneLifePoints.text = [[ARCHDuelCalculator sharedARCHDuelCalculator].duelistOneLifePoints stringValue];
self.duelistTwoLifePoints.text = [[ARCHDuelCalculator sharedARCHDuelCalculator].duelistTwoLifePoints stringValue];
self.hiddenTextField.text = #"";
[self syncTextField: self.hiddenTextField];
[self.hiddenTextField resignFirstResponder];
}
- (void) animateLifePoints
{
NSNumber *sections = [[ARCHDuelCalculator sharedARCHDuelCalculator] getLifePointSections];
for(int timer = 0; timer < 100; ++timer)
{
self.duelistOneLifePoints.text = [[[ARCHUtilities sharedARCHUtilities] subtractTwoNSNumbersByDataType:#"int" firstNumber:[NSNumber numberWithInt: [self.duelistOneLifePoints.text intValue]] secondNumber:sections] stringValue];
if ((timer % 14) == 0)
{
[self playLifePointSound:#"mainLifePointSound" typeOfFile:#"mp3"];
}
}
[animationTimer invalidate];
}
hope this works:
-split addLifePoints into 2 methods.
-put code after the nstimer in another method (newMethod)
-call newMethod right after the nstimer is invalidated.
- (IBAction)addLifePoints:(UIButton *)sender
{
[[ARCHDuelCalculator sharedARCHDuelCalculator] setLifePointDelta:[NSNumber numberWithInt: [self.hiddenTextField.text intValue]]];
[[ARCHDuelCalculator sharedARCHDuelCalculator] setAddOrSubstract: YES];
[[ARCHDuelCalculator sharedARCHDuelCalculator] applyingDeltaToLifePointsByDelta];
// This will animate the life points
animationTimer = [NSTimer scheduledTimerWithTimeInterval:.01 target:self selector:#selector(animateLifePoints) userInfo:nil repeats:YES];
}
- (void) animateLifePoints
{
NSNumber *sections = [[ARCHDuelCalculator sharedARCHDuelCalculator] getLifePointSections];
for(int timer = 0; timer < 100; ++timer)
{
self.duelistOneLifePoints.text = [[[ARCHUtilities sharedARCHUtilities] subtractTwoNSNumbersByDataType:#"int" firstNumber:[NSNumber numberWithInt: [self.duelistOneLifePoints.text intValue]] secondNumber:sections] stringValue];
if ((timer % 14) == 0)
{
[self playLifePointSound:#"mainLifePointSound" typeOfFile:#"mp3"];
}
}
[animationTimer invalidate];
[self newMethod]; //////////////////// ADD THIS LINE ALSO, continue code
}
-(void)newMethod{
//...so continue code...
// This is where we bring it back to the view controller
self.duelistOneLifePoints.text = [[ARCHDuelCalculator sharedARCHDuelCalculator].duelistOneLifePoints stringValue];
self.duelistTwoLifePoints.text = [[ARCHDuelCalculator sharedARCHDuelCalculator].duelistTwoLifePoints stringValue];
self.hiddenTextField.text = #"";
[self syncTextField: self.hiddenTextField];
[self.hiddenTextField resignFirstResponder];
}

Resources