2017-01-23 26 views
-1

我使用Objective-C制作秒表。我已经有了3个按钮的基本秒表:开始,停止和重置。这里是我的viewcontroller.m代码:如何让两个按钮更改标题并执行两个不同的功能?

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

-(IBAction)Start:(id)start 
{ 
    Timer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self   selector:@selector(addingthetime) userInfo:nil repeats:YES]; 
} 

-(IBAction)Stop:(id)sender 
{ 
    [Timer invalidate]; 
} 

-(IBAction)Restart:(id)sender 
{ 
    [Timer invalidate]; 
    addingtheTime = 0; 
    Label.text = [NSString stringWithFormat:@"0.00"]; 
} 

-(void)addingthetime 
{ 
    addingtheTime = addingtheTime + 0.01; 
    Label.text = [NSString stringWithFormat:@"%.2f", addingtheTime]; 
} 

@end 

这里是我的viewcontroller.h代码:

#import <UIKit/UIKit.h> 

float addingtheTime; 

@interface ViewController : UIViewController 
{ 
    IBOutlet UILabel *Label; 
    NSTimer *Timer; 
} 

@end 

所以我的问题是如何让我开始按钮执行下列操作一次点击:

  1. 启动自拍
  2. 标题更改为停止 (再次单击同一按钮)
  3. 停止计时器
  4. 标题更改为启动

所以目标是只有一个按钮,启动和停止计时器,但请我希望标题改变。

不要担心重置按钮,因为我希望它自己保持。

PS。请解释清楚,因为我发现很难理解一些事情,所以我是一个初学者,所以尽量保持简单,谢谢,如果问题不明确,很抱歉。

回答

-3

在ViewController.h:

#import <UIKit/UIKit.h> 

float addingtheTime; 

@interface ViewController : UIViewController 
{ 
    IBOutlet UILabel *Label; 

    NSTimer *Timer; 

} 

@end 

在ViewController.m:

#import "ViewController.h" 

@interface ViewController() 


@end 

@implementation ViewController 


- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a  nib. 
} 

-(void)addingthetime 
{ 
    addingtheTime = addingtheTime + 0.01; 
    Label.text = [NSString stringWithFormat:@"%.2f", addingtheTime]; 
} 

- (IBAction)startOrStopAction:(UIButton *)sender { 

    // stop 
    if ([sender.titleLabel.text isEqualToString:@"stop"]) { 

     [Timer setFireDate:[NSDate distantFuture]]; 

     [sender setTitle:@"start" forState:UIControlStateNormal]; 
    } 
    // start 
    else { 

     if (!Timer) { 
      Timer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(addingthetime) userInfo:nil repeats:YES]; 
     }else { 
      [Timer setFireDate:[NSDate date]]; 
     } 

     [sender setTitle:@"stop" forState:UIControlStateNormal]; 
    } 

} 


@end 

其结果是:

在iPhone:

enter image description here

在iPad上:

enter image description here

+0

嘿,不幸的是,当我运行它,它崩溃了我的iPad;(抱歉,谢谢,不知道是什么造成的! –

+0

@MattPidd它会在iphone上崩溃吗? – aircraft

+0

@Matt Pidd,我更新了我的帖子,检查它。 – aircraft

0

您可以使用button.tag属性来实现此目的。默认情况下,button.tag财产有0。因此,假定0是定时器未启动时的状态,1是定时器启动时的状态。您可以根据自定义逻辑操作.tag属性。

-(IBAction)Start:(id)start 
{ 
    UIButton *button = (UIButton *)start; 
    if (button.tag == 0){ 
     button.tag = 1; 
     [button setTitle:@"Stop" forControlState:UIControlStateNormal]; 
     Timer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self   selector:@selector(addingthetime) userInfo:nil repeats:YES]; 
    }else { 
     button.tag = 0; 
     [button setTitle:@"Stop" forControlState:UIControlStateNormal]; 
     //Invoke your method to stop Timer. 
    } 
} 
+0

虽然这确实解决这个问题,我倾向于避免标签属性B/C许多开发商仍然使用viewWithTag方法定位的看法。我可能只是在视图控制器中有一个BOOL标记,或者可能是一个枚举“状态”,以防您需要覆盖其他情况。 – ghostatron

+0

嘿,我试了一下,但它给了我这个错误消息:“没有可见的@interface为UIButton声明选择器setTitle:forControlState:这可能很简单,但我只是一个初学者。 (我知道我很笨;) - 另一行是[button setTitle:@“Stop”for ControlState:UIControlStateNormal]; - 非常感谢您的帮助。开始“forControlState:UIControlStateNormal]; –

相关问题