【问题标题】:Countdown timer: updating controller view labels倒数计时器:更新控制器视图标签
【发布时间】:2014-07-06 22:42:24
【问题描述】:

我正在尝试设置倒数计时器。我有两个视图控制器:ViewController 和 EditViewController。 ViewController 有两个标签小时和分钟。 EditViewController 有一个 UIDatePicker 和一个保存按钮。当用户在 UIDatePicker 上选择时间并点击保存时,它们将被重定向回 ViewController,并且小时和分钟标签会填充所选时间和当前时间之间的差异。这会自动更新,直到差异为 0。我在尝试让小时和分钟正确显示在 ViewController 标签上时遇到问题。这是我的代码:

ViewController.m

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.hourLabel.text = self.hourText;
    self.minuteLabel.text = self.minuteText;
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

EditViewController.h

@interface EditViewController : UIViewController
@property (weak, nonatomic) IBOutlet UIDatePicker *datePicker;
@property (weak, nonatomic) IBOutlet NSString *currentTimeString;
@property (weak, nonatomic) IBOutlet NSString *endTimeString;
- (IBAction)saveButton:(id)sender;
- (IBAction)cancelButton:(id)sender;

-(void)updateTime;

@end

EditViewController.m

#import "EditViewController.h"
#import "ViewController.h"

@interface EditViewController ()

@end

@implementation EditViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self)
    {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

}


- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)saveButton:(id)sender
{

    NSCalendar *now = [NSCalendar autoupdatingCurrentCalendar];
    NSInteger currentTime = (NSHourCalendarUnit | NSSecondCalendarUnit);
    self.datePicker.date = [now dateFromComponents:[now components:currentTime fromDate:self.datePicker.date]];

    NSTimer *timer;
    timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTime) userInfo:nil repeats:YES];

    [self dismissViewControllerAnimated:YES completion:nil];
}

-(void)updateTime
{
    NSInteger timeLeft = ((NSInteger)[self.datePicker.date timeIntervalSinceNow]);
    NSInteger minutes = (timeLeft / 60) % 60;
    NSInteger hours = (timeLeft / 3600) % 24;

    ViewController *controller;
    controller.hourText = [NSString stringWithFormat:@"%ldi",(long)hours];
    controller.minuteText = [NSString stringWithFormat:@"%ldi",(long)minutes];
    NSLog(@"The time is %ld",(long)timeLeft);

}

- (IBAction)cancelButton:(id)sender
{
    [self dismissViewControllerAnimated:YES completion:nil];
}

@end

感谢任何帮助。提前致谢。

【问题讨论】:

    标签: ios datepicker uilabel nstimer viewcontroller


    【解决方案1】:

    在此处查看您的代码中已编辑的方法。这将完全满足您的要求。

    #import "EditViewController.h"
    #import "ViewController.h"
    #import "AppDelegate.h"
    @interface EditViewController ()
    {
        AppDelegate *appDelegate;
    }
    @end
    
    @implementation EditViewController
    
    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    {
        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        if (self)
        {
            // Custom initialization
            appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
        }
        return self;
    }
    
    
    -(void)updateTime
    {
        NSInteger timeLeft = ((NSInteger)[self.datePicker.date timeIntervalSinceNow]);
        NSInteger minutes = (timeLeft / 60) % 60;
        NSInteger hours = (timeLeft / 3600) % 24;
    
        NSString *hourText = [NSString stringWithFormat:@"%ldi",(long)hours];
        NSString *minuteText = [NSString stringWithFormat:@"%ldi",(long)minutes];
    
        [appDelegate updateTime:hourText andMinute:minuteText];
    
    }
    

    最后,在 AppDelegate 类中定义一个方法

    - (void) updateTime:(NSString *)hourStr andMinute:(NSString *)minuteStr
    {
       for(id obj in [self.navigationController viewControllers])
       {
          if([obj isKindOfClass:ViewController])
          {
            ViewController *vcObj = (ViewController *)obj;
            vcObj.hourLabel.text = hourStr;
            vcObj.minuteLabel.text = minuteStr;
    
          }
       }
    }
    

    【讨论】:

      【解决方案2】:

      几个问题:

      ViewController.m

      self.hourLabel.text = self.hourText;
      self.minuteLabel.text = self.minuteText;
      

      应该在viewWillAppear 而不是viewDidLoad。发生的事情是您在应用加载时设置文本。 viewDidLoad 只会为该应用程序实例触发一次。当您从 EditViewController 回来时,您需要做的是更新它,对吗?所以如果你把它放在viewWillAppear,当你回来时它也会被调用并为你更新。

      接下来的事情:

      EditViewController.m

      ViewController *controller;
      controller.hourText = [NSString stringWithFormat:@"%ldi",(long)hours];
      controller.minuteText = [NSString stringWithFormat:@"%ldi",(long)minutes];
      NSLog(@"The time is %ld",(long)timeLeft);
      

      这段代码 sn-p 声明了一个新的 ViewController 变量(嗯,大部分情况下,您都缺少= [ViewController new] 部分)。这样做的问题是您对这个控制器没有做任何事情。 ViewController 实际上已经在您的导航堆栈中(我假设 NavigationController,因为您在用户返回时说过),因此您需要使用对 ViewController 的引用,您的应用程序已经实例化,而不是创建一个新的,因为您从未使用过这个人任何地方。

      【讨论】:

        猜你喜欢
        • 2016-12-17
        • 2012-03-02
        • 2021-08-09
        • 1970-01-01
        • 1970-01-01
        • 2019-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多