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
Related
i need to play vibration in ios for less than 0.25 second and the sequence of vibration will be like
1 vibration for 0.25 sec then 3 vibration for 0.15 second and this loop will continue for limited time say 2 or 3 minute. also the accuracy is needed here means each vibration must have to start at exact time
right now when i play vibration it play exactly one time per second
-(IBAction)onBtnVibrateClicked:(id)sender {
[self.view endEditing:YES];
[myTimer invalidate];
if(_txt_VibrationPerMinute.text.length == 0){
_txt_VibrationPerMinute.text = #"10";
}
myTimer = [NSTimer scheduledTimerWithTimeInterval:60/[_txt_VibrationPerMinute.text intValue]
target:self
selector:#selector(targetMethod:)
userInfo:nil
repeats:YES];
}
- (IBAction)obBtnStopVibrationClicked:(id)sender {
[myTimer invalidate];
}
-(void)targetMethod:(NSTimer *)timer {
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
}
Yes, you can use something like this
FOUNDATION_EXTERN void AudioServicesPlaySystemSoundWithVibration(UInt32 inSystemSoundID,id arg,NSDictionary* vibratePattern);
void vibrate(float durationInSeconds, float intensivity, long count)
{
NSMutableDictionary* dict = [NSMutableDictionary dictionary];
NSMutableArray* arr = [NSMutableArray array];
for (long i = count; i--;)
{
[arr addObject:[NSNumber numberWithBool:YES]]; //vibrate
[arr addObject:[NSNumber numberWithInt:durationInSeconds*1000]];
[arr addObject:[NSNumber numberWithBool:NO]]; //stop
[arr addObject:[NSNumber numberWithInt:durationInSeconds*1000]];
}
[dict setObject:arr forKey:#"VibePattern"];
[dict setObject:[NSNumber numberWithFloat:intensivity] forKey:#"Intensity"];
AudioServicesPlaySystemSoundWithVibration(4095,nil,dict);
}
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];
}
I have a chunk of string and i am taking all string in array list separate by white space and want to display in same text box one by one suppose i have a string "my name is xyz" then text box should contends data like this "my" then wait for few seconds and then display "name" and again wait and display "is" and so on.....
- (IBAction)btnstart:(id)sender {
NSString *myString=self.textcollector.text;
NSArray *readerArray=[myString componentsSeparatedByString:#" "];
int arraylenght=[readerArray count];
textcollector.text=#"";
for(int i=0;i<arraylenght;i++)
{
//textcollector=NULL;
self.textcollector.text=readerArray[i];
//NSLog(#" ",readerArray[i]);
sleep(1);
// textcollector.a
}
}
See my code :
In your .h file : define array of string.
#property (strong, nonatomic) NSArray *aryAll;
In your .m file .
#synthesize aryAll;
In btnstart
- (IBAction)btnstart:(id)sender {
self.aryAll = [[NSArray alloc] init];
NSString *stringAnimation = #"My name is kirit modi come from deesa city";
aryAll = [stringAnimation componentsSeparatedByString:#" "];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0),
^{
[self animationString];
});
}
Method for animation :
-(void)animationString
{
for (int i =0; i< aryAll.count; i++)
{
dispatch_async(dispatch_get_main_queue(),
^{
[labnanme setText:[aryAll objectAtIndex:i]];
});
[NSThread sleepForTimeInterval:1];
}
}
You output is:
Try this ,declare readerArray and i as global
NSArray *readerArray;
int i;
- (IBAction)btnstart:(id)sender
{
NSString *myString=self.textcollector.text;
readerArray=[myString componentsSeparatedByString:#" "];
NSUInteger arraylenght=[readerArray count];
self.statuslabel.text=#"";
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:#selector(showText) userInfo:nil repeats:YES];
}
-(void)showText
{
if (i<[readerArray count])
{
self.textcollector.text=readerArray[i];
i++;
}
}
invalidate the timer at last
I am attempting to find the average of 10 signal strength values that have been inserted into an array periodically with the NSTimer function. I know the timer is working due to the console logs, but the array of the 10 values does not. Is there a small error in the code or potentially an issue with the if/else statement?
- (IBAction)getSignalAvg:(id)sender {
myTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
target:self
selector:#selector(arrayBuild)
userInfo:nil
repeats:YES];
}
- (void)arrayBuild {
loopCount++;
// Initialise Array
NSMutableArray *resultsArray = [[NSMutableArray alloc]init];
if (loopCount >= 11) {
// Invalidate Timer
[myTimer invalidate];
myTimer = nil;
// Find Average
NSNumber *avg = [resultsArray valueForKeyPath:#"#avg.self"];
// Change Text of Label to Average & Log
self.avgSignal.text = [NSString stringWithFormat:#"%#",avg];
NSLog(#"%#",avg);
}else{
// Declare Signal Strength
float signalstrength = CTGetSignalStrength();
// Individual Result & Convert to Integer
NSString *result = [NSString stringWithFormat:#"%f", signalstrength];
NSInteger resultInt = [result integerValue];
// Add Object
[resultsArray addObject:[NSNumber numberWithFloat:resultInt]];
// Change Text of Label Each Second
self.avgSignal.text = [NSString stringWithFormat:#"%d",loopCount];
NSLog(#"%f",signalstrength);
}
}
Every time the arrayBuild method is called you create a new NSMutableArray thus you will only have the one value in there.
You need to create a class instance for the NSMutableArray resultsArray. Just declare a property in the .h file of this class like:
#property (nonatomic, strong) NSMutableArray *resultsArray;
And in the init of the class:
- (instancetype)init{
self = [super init];
if (self) {
_resultsArray = [[NSMutableArray alloc]init];
}
return self;
}
And remove the NSMutableArray *resultsArray = [[NSMutableArray alloc]init]; in arrayBuild and use self.resultsArray instate of resultsArray.
Declare yout resultArray in .h file because each n every time you're creating new array. That's why you're not able to do that. So please use like this
.h File
NSMutableArray *resultsArray;
.m File
- (IBAction)getSignalAvg:(id)sender {
myTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
target:self
selector:#selector(arrayBuild)
userInfo:nil repeats:YES];
// Initialise Array
if([resultArray count] == 0)
resultsArray = [[NSMutableArray alloc]init];
else
[resultArray removeAllObjects];
}
- (void)arrayBuild {
loopCount++;
if (loopCount >= 11) {
// Invalidate Timer
[myTimer invalidate];
myTimer = nil;
// Find Average
NSNumber *avg = [resultsArray valueForKeyPath:#"#avg.self"];
// Change Text of Label to Average & Log
self.avgSignal.text = [NSString stringWithFormat:#"%#",avg];
NSLog(#"%#",avg);
}else{
// Declare Signal Strength
float signalstrength = CTGetSignalStrength();
// Individual Result & Convert to Integer
NSString *result = [NSString stringWithFormat:#"%f", signalstrength];
NSInteger resultInt = [result integerValue];
// Add Object
[resultsArray addObject:[NSNumber numberWithFloat:resultInt]];
// Change Text of Label Each Second
self.avgSignal.text = [NSString stringWithFormat:#"%d",loopCount];
NSLog(#"%f",signalstrength);
}
}
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 ++;
}