Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何根据iOS中的时间安排更改UIView元素?_Ios_Uiview_Nstimer - Fatal编程技术网

如何根据iOS中的时间安排更改UIView元素?

如何根据iOS中的时间安排更改UIView元素?,ios,uiview,nstimer,Ios,Uiview,Nstimer,我正在开发一个应用程序,在这个应用程序中,UIView有一些元素(如图像、按钮等),这些元素标有时间文本,如下午2:30、下午3:30。现在我希望调用viewDidLoad时,如果当前时间已过下午2:30,则该对象的视图应更改,如果当前时间未过下午3:30,则其视图应保持原样 如图所示,如果当前时间经过12:30 PM和2:15 PM,则这两个按钮的视图应更改,其他按钮视图应保持原样 我尝试了NSDate和NSDateFormatter类,将字符串转换为整数并进行比较,但没有得到完美的输出 我

我正在开发一个应用程序,在这个应用程序中,
UIView
有一些元素(如图像、按钮等),这些元素标有时间文本,如下午2:30、下午3:30。现在我希望调用viewDidLoad时,如果当前时间已过下午2:30,则该对象的视图应更改,如果当前时间未过下午3:30,则其视图应保持原样

如图所示,如果当前时间经过12:30 PM和2:15 PM,则这两个按钮的
视图应更改,其他按钮视图应保持原样

我尝试了
NSDate
NSDateFormatter
类,将字符串转换为整数并进行比较,但没有得到完美的输出


我需要在这里使用
NSTimer
类吗?

您可以使用
NSTimer
执行您所描述的操作

将此添加到您的
viewDidLoad

self.uiTimer = [NSTimer scheduledTimerWithTimeInterval:5.0
                 target:self
                 selector:@selector(updateUI:)
                 userInfo:nil
                 repeats:YES];
这个计时器(别忘了定义一个属性来管理它)将每5秒调用一次它的目标方法,但是您可以根据需要更改它

然后,定义如下所示的目标方法,在其中修改UI:

- (void)updateUI:(NSTimer*)timer {

     <if time is less than X, then… else …>
}

如果希望每60分钟调用一次方法:


.h文件

@property (strong, nonatomic) NSTimer *timer;

.m文件

- (void)startTimer {
    if (timer.isValid)
        return;
    timer = [NSTimer timerWithTimeInterval:3600 target:self selector:@selector(myMethod) userInfo:nil repeats:YES];
    [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
    [timer fire];
}

- (void)myMethod {
// change element code
}

您不需要为此使用NSTimer类。我遇到了相同的问题,我使用了[NSDate compare]类。 您必须获取按钮的标题文本,并将其存储为NSString,然后使用NSDate、NSDateFormatter类比较此字符串和当前时间

像这样:

NSString *str1 = btn1.titleLabel.text;

NSDate *occDate = [NSDate date];
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
[formatter setDateFormat:@"hh:mm a"];
NSString *occStr = [formatter stringFromDate:occDate];
NSDate *lDate = [formatter dateFromString:occStr];
NSDate *d1 = [formatter dateFromString:str1];

NSComparisonResult result1 = [lDate compare:d1];
if(result1 == NSOrderedDescending)
{
    [btn1 setBackgroundColor:[UIColor redColor]];
}

希望它能起作用。

你需要一个NSTimer,你可以在中找到很多例子,所以…你知道关于这个的好教程吗?请看我的答案。这是如此简单,你不需要一个教程…谢谢。我已通过添加图像更新了我的问题。如何将NSTimer与NSDate一起使用?(当前时间)。您不将时间与NSDate一起使用。您要做的是,在
updateUI
中,获取当前时间,然后比较每个按钮(它们是否在一个数组中?);如果某个按钮比当前时间“旧”,则更改该按钮。我不能提供更多的帮助,因为我不知道你的代码是什么样子的…但我希望这将使你在正确的方向。您需要将NSDate与每个按钮关联,然后将该日期与当前时间进行比较。Dealloc将永远不会被调用,因为计时器保留其目标、可重复且从不失效,因此您应该在VIEWDIDGEARE(如果是“叶”)中的某个位置或从该屏幕返回时使其失效。
NSString *str1 = btn1.titleLabel.text;

NSDate *occDate = [NSDate date];
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
[formatter setDateFormat:@"hh:mm a"];
NSString *occStr = [formatter stringFromDate:occDate];
NSDate *lDate = [formatter dateFromString:occStr];
NSDate *d1 = [formatter dateFromString:str1];

NSComparisonResult result1 = [lDate compare:d1];
if(result1 == NSOrderedDescending)
{
    [btn1 setBackgroundColor:[UIColor redColor]];
}