Какао Touch - Looping Help - PullRequest
       12

Какао Touch - Looping Help

0 голосов
/ 06 августа 2010

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

РЕДАКТИРОВАТЬ: я отредактировал код для этого, через 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];
}

Ответы [ 2 ]

0 голосов
/ 06 августа 2010

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

Но как только этот контроллер представления создан и представление установлено, математическая проблема будет обновляться каждые 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 голосов
/ 06 августа 2010

Вы не должны 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...