2010-08-06 2 views
0

Мне нужна помощь с некоторой логикой программирования ... Мне нужно закодировать этот метод, чтобы отобразить математическую задачу в моих меток, затем sleep(5), а затем снова петлю. Все, что я пробовал, заканчивает замораживание программы. Пожалуйста помоги! Я рвал мои волосы, пытаясь все, что знаю!Cocoa Touch - Looping Help

EDIT: Я редактировал код этого, через 3 секунды она исчезает ярлык, отображающее эту проблему, но затем он упал и отладчик отображает 2010-08-06 10:43:27.776 Reactor [13444:207] modifying layer that is being finalized - 0x5c13500

//quickfire problems 
-(void)simpleMath{ //"Tap when the answer is X" 
    isTimeToTap = NO; 
    int problemSelector = arc4random() % 4; 

    NSArray *mathProblems = [[NSArray alloc] initWithObjects:@"6 - 1",@"2 + 3",@"3 x 2",@"3 x 1",@"2 x 4",nil]; //correct index 2 
    NSArray *mathAnswers = [[NSArray alloc] initWithObjects:@"5",@"5",@"6",@"3",@"8",nil]; //correct index 2 

    if ([mathAnswers objectAtIndex:problemSelector] == @"6") { 
     isTimeToTap = YES; 
    } 

    if (ranBefore == NO) { //create labels 

     //tell when to tap 
     tapTellerTop.text = @"Tap when the answer is 6!"; 
     tapTellerBottom.text = @"Tap when the answer is 6!"; 

     //make bottom label 
     mathDisplayBottom = [[UILabel alloc] initWithFrame:CGRectMake(15, 250, 242, 92)]; 
     mathDisplayBottom.font = [UIFont fontWithName:@"Helvetica" size: 96.0]; 
     mathDisplayBottom.textColor = [UIColor whiteColor]; 
     mathDisplayBottom.backgroundColor = [UIColor clearColor]; 
     [self.view addSubview: mathDisplayBottom]; 

     //make top label 
     mathDisplayTop = [[UILabel alloc] initWithFrame:CGRectMake(55, 120, 242, 92)]; 
     mathDisplayTop.font = [UIFont fontWithName:@"Helvetica" size: 96.0]; 
     mathDisplayTop.textColor = [UIColor whiteColor]; 
     mathDisplayTop.backgroundColor = [UIColor clearColor]; 
     [self.view addSubview: mathDisplayTop]; 
     //rotate top label 
     mathDisplayTop.transform = CGAffineTransformMakeRotation(180.0 /180.0 * M_PI); 
    } 
    //if ran before just update the text 
    mathDisplayBottom.text = [mathProblems objectAtIndex:problemSelector]; 
    mathDisplayTop.text = [mathProblems objectAtIndex:problemSelector]; 

    ranBefore = YES; //if its here. its been ran. 

    //run timer wait for (3) then loop again until userTaps = YES 
    [self performSelector:@selector(simpleMath) withObject:nil afterDelay:3.0f]; 

    [mathProblems release]; 
    [mathAnswers release]; 
    [mathDisplayBottom release]; 
    [mathDisplayTop release]; 
} 
+0

Таким образом, цель иметь математическую задачу отображается в течение 5 секунд, и если ответ на проблемы 6 пользователь должен нажать на кнопку в то время? – theMikeSwan

+0

К сожалению, я сделал ошибку. Я ошибся. Не хочу, чтобы она остановилась, когда она равна 6. Она должна просто ждать 5 секунд, а затем снова петля, как и все остальные. – user377419

+0

Не спите и не петляйте. Переместите массив проблем и текущий индекс на ivars в контроллере. Когда пользователь нажимает кнопку, проверьте, является ли текущий индекс действительным индексом (в этом случае только 2 является действительным) и выполняйте любую доброту, которую вы делаете. Наконец, запустите таймер на 5 секунд, который продвигает индекс (или просто захватывает некоторый случайный индекс, как у вас есть), и отображает обновления. –

ответ

0

Сон остановит ваше приложение от запуска или ответа вообще. Ниже приведен быстрый частичный пример контроллера вида, который вы можете использовать. Это предполагает, что вы подключаете кнопку крана и используете только одну из меток и т. Д., Но вы можете поиграть с ней. Кроме того, это не будет касаться проблем с памятью или чего-то еще, поэтому вы добавите поддержку для этого.

Но после создания этого контроллера вида и установки вида математическая проблема будет обновляться каждые 5 секунд. Если пользователь нажимает кнопку и ответ верен, мы регистрируем сообщение об успешном завершении, иначе мы регистрируем сообщение об ошибке.

@interface myMathController : UIViewController { 
    NSArray* mathProblems; 
    NSIndexSet* validIndexes; 
    NSUInteger currentIndex; 

    NSTimer* timer; 
} 

@property(nonatomic,assign) IBOutlet UILabel* mathDisplayLabel; 

- (void)updateProblem:(NSTimer*)timer; 
- (IBAction)userTap; 

@end 

@implementation myMathController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    mathProblems = [[NSArray alloc] initWithObjects:@"6 - 1",@"2 + 3",@"3 x 2",@"3 x 1",@"2 x 4",nil]; 
    // Add all valid answers 
    NSMutableIndexSet* tempIndexes = [[NSMutableIndexSet alloc] init]; 
    [tempIndexes addIndex:2]; 
    validIndexs = [tempIndexes copy]; 
    [tempIndexes release]; 

    timer = [[NSTimer alloc] initWithFireDate:[NSDate date] interval:5.0 target:self selector:@selector(updateProblem:) userInfo:nil repeats:YES]; 
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 
} 

- (void)updateProblem:(NSTimer*)timer 
{ 
    currentIndex = arc4random() % [mathProblems count]; 
    [mathDisplayLabel setText:[mathProblems objectAtIndex:currentIndex]]; 
} 

- (void)userTap 
{ 
    if([validIndexes containsIndex:currentIndex]) { 
     NSLog(@"This user is SMART!"); 
    } else { 
     NSLog(@"This user needs more work!"); 
    } 
} 

- (void)dealloc 
{ 
    [timer invalidate]; 
    [timer release]; 
    [mathProblems release]; 
    [validIndexes release]; 
    [super dealloc]; 
} 

@end 
0

Вы не должны sleep(), когда-либо. Чтобы вызвать функцию повторно, вызовите:

[NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(doStuff:) 
               userInfo:nil repeats:YES]; 

затем определим функцию:

-(void)doStuff:(NSTimer*)timer 
{ 
    // stuff 
    if (iAmDone) [timer invalidate]; 
} 

ИЛИ, если вы хотите, чтобы огонь еще один звонок, через 5 секунд, вы могли бы назвать

if (!iAmDone) [self performSelector:@selector(simpleMath) afterDelay:5]; 

в конце simpleMath.

+0

хорошо. Почему я не могу использовать его? и как насчет проблемы с петлей? – user377419

+0

Управление потоком в вашей программе осуществляется с помощью объектной среды выполнения C, в чем-то называемом циклом запуска. Это обрабатывает передачу сообщений взад и вперед и синхронизацию определенных действий.После того, как ваши методы будут выполнены и возвращены, среда выполнения может продолжать выполнять свою работу. Если ваш метод вызывает 'sleep()', он эффективно блокирует этот процесс, не отменяя контроль. Поэтому вам нужно использовать другие методы. – mvds

+0

Хорошо, поэтому его можно использовать просто не в этой ситуации? – user377419