UISlider, чтобы изменить приложение сбоя интервала NSTimer при перемещении - PullRequest
0 голосов
/ 28 августа 2010

У меня возникли проблемы при создании UISlider, который можно использовать для изменения созданного мною NSTimer. По сути, ползунок предназначен для изменения целого числа, с которого NSTimer ведет обратный отсчет, но когда я пытаюсь переместить UISlider, приложение вылетает, я предполагаю, что это потому, что оно мешает обратному отсчету, который происходит, но я не знаю, что делать, чтобы это исправить.

Вот соответствующий код

   - (void)viewDidLoad {

    [label setFont:[UIFont fontWithName:@"DBLCDTempBlack" size:36.0]];
    label.text = @"I0A0IN6";
    mainInt = mySlider.value;
    timer = [NSTimer scheduledTimerWithTimeInterval:(1.0/1.0) target:self selector:@selector (timerVoid) userInfo:nil repeats:YES];
    [super viewDidLoad];
}

- (void)timerVoid {

    mainInt += -1;
    if (mainInt == 0) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Break Time!" 
                                                        message:@"Time to take a break, please go to the exorcises page during your break inorder to maximise it"
                                                       delegate:nil 
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles: nil];
        [alert show];

        [mainInt invalidate]; 
    }
    [label setFont:[UIFont fontWithName:@"DBLCDTempBlack" size:36.0]];
    label.text=[NSString stringWithFormat:@"%d" , mainInt];

}

Слайдер называется mySlider, и он изменяет интергер "mainInt" (строка 5).

Ответы [ 2 ]

1 голос
/ 28 августа 2010

Мало вещей:

  • [super viewDidLoad]; строка лучше быть первой в viewDidLoad.
  • Нет необходимости устанавливать шрифт при каждом выполнении timerVoid.
  • Как я уже упоминал в комментарии, вы должны звонить invalidate на timer, а не на mainInt.
  • Ползунок не не изменяет mainInt - вы установили значение mainInt для хранения начального значения вашего ползунка, и оно не изменяется само по себе при изменении значения ползунка. Для этого вам нужно создать IBAction и подключить его к событию valueChanged ползунка. Внутри этого IBAction вы можете делать все что угодно с новым значением ползунка - например, устанавливать значение mainInt или перепланировать таймер.
  • Вы также можете избежать использования IBAction, используя mySlider.value непосредственно везде, где вам нужно.
  • Хотя я не вижу причин для сбоя приложения ...

Возможный код:

- (void)viewDidLoad {
    // This line should be first
    [super viewDidLoad];

    [label setFont:[UIFont fontWithName:@"DBLCDTempBlack" size:36.0]];
    label.text = @"I0A0IN6";

    // There is no need in mainInt
    //mainInt = mySlider.value;

    timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerVoid) userInfo:nil repeats:YES];
}

- (void)timerVoid {

    // This line is much more readable like this ("-=" instead of "+= -")
    mySlider.value -= 1;

    // Much better to use "<=" in this case to avoid bugs
    if (mySlider.value <= 0) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Break Time!" 
                                                        message:@"Time to take a break, please go to the exorcises page during your break inorder to maximise it"
                                                       delegate:nil 
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles: nil];
        [alert show];
        [alert release]; // Haven't noticed the lack of release here earlier...

        // timer and not mainInt
        [timer invalidate]; 
    }

    // The next line is unnecessary 
    //[label setFont:[UIFont fontWithName:@"DBLCDTempBlack" size:36.0]];
    label.text = [NSString stringWithFormat:@"%d", mySlider.value];
}

EDIT
Добавлена ​​строка [alert release];

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

Ваше приложение падает, потому что вы не связали событие valueChanged со своего ползунка с каким-либо надлежащим методом IBAction.

...