2010-08-28 64 views
0

我一直在创建可用于修改我创建的NSTimer的UISlider时遇到问题。本质上滑块是修改NSTimer正在倒计时的整数,但当我尝试移动UISlider时,应用程序崩溃,我假设这是因为它干扰正在发生的倒计时,但我不不知道该怎么做才能解决这个问题。UISlider在移动时修改NSTimer间隔崩溃应用程序

下面是相关代码

- (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行)。

+0

请张贴在滑块的valueChanged事件上调用的选择器的代码。为什么你有'[mainInt invalidate];'line?也许你的意思是'[timer invalidate];'?有几个额外的小变化,你最好对你的代码做,但没有一个是要解决你的问题... – 2010-08-28 09:02:35

+0

我的歉意,我试着不同的修复自己,并且必须留下mainInt出于某种原因,你说得对,应该是定时器invaldate, 我不完全确定你的意思是“请张贴在滑块的valueChanged事件上调用的选择器的代码。”我不相信我有任何类似的事情,我所做的就是将UIslider的功能链接到IB(“\t IBOutlet UISlider * mySlider;”)的滑块,然后将该值设置为等于定时器中使用的变量。 – 2010-08-28 09:26:19

回答

1

几件事情:

  • [super viewDidLoad];线最好是先在viewDidLoad
  • 每次执行timerVoid时都不需要设置字体。
  • 正如我在评论中提到的,您应该致电invalidatetimer而不是mainInt
  • 滑块不会修改mainInt - 您已将mainInt的值设置为保存滑块的初始值,并且在更改滑块的值时不会自行更改它。为了做到这一点,你应该创建一个IBAction并将其连接到滑块的valueChanged事件。在IBAction里面,你可以用滑块的新值来做任何你想做的事 - 例如设置mainInt的值或者重新安排你的计时器。
  • 您也可以避免直接在任何需要的地方使用mySlider.value来使用IBAction。
  • 我看不出有任何理由,虽然崩溃的应用程序...

可能的代码:

- (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]; 
} 

编辑
添加了[alert release];线

+0

所以我在你发送的代码中进行了修改,但它仍然存在相同的问题,但现在不是显示IB(2700)中设置的滑块初始值的计时器,而是显示值为0,并且如果我尝试移动滑块,应用程序崩溃。 – 2010-08-28 11:47:40

+0

另外有趣的是,如果我抓住滑块并向上/向下移动滑块,将其保持在位置上,但实际上并未释放它们的键,滑块显示的数字远离我在IB(0-3600)中设置的混合/ ,如1616025731或类似值的负数...... – 2010-08-28 11:53:28

+0

如果你的初始代码崩溃了,那么我相信你有一些额外的代码涉及'mySlider'。或者'mySlider'连接到一些IBAction。没有理由使你的原始代码崩溃 - 它应该只是一个没有连接任何东西的滑块。 – 2010-08-28 12:31:03

0

您的应用程序因为您没有将滑块中的valueChanged事件链接到任何适当的IBAction方法而崩溃。