简体   繁体   English

经过时间和设定日期?

[英]Elapsed time and setting a date?

Here is what I'm trying to accomplish: User touches a button, and and can share something to facebook. 这是我要完成的工作:用户触摸一个按钮,并可以与Facebook分享一些内容。 The date that the user touched the button is set, and for 24 seconds the user cannot share anything to facebook again. 设置了用户触摸按钮的日期,并且在24秒钟内用户无法再次与Facebook分享任何内容。 After 24 seconds, the user then is allowed to share another post to facebook. 24秒后,然后允许用户将另一个帖子分享到Facebook。

The error is not facebook related, but it has something to do with the elapsedTime. 该错误与facebook没有关系,但与elapsedTime有关。 After the elapsedTime is reset, it doesn't count back up to 24. It just stays at a very small number like "0.0043" 重置elapsedTime之后,它最多不计回24。它只是停留在一个很小的数字上,例如“ 0.0043”

Here's my code: 这是我的代码:

-(void)postToFacebook
{
    if (elapsedTime >= 24) {
        [[CCDirector sharedDirector] pause];
        [[CCDirector sharedDirector] stopAnimation];

        CCAppDelegate *app = (CCAppDelegate*) [[UIApplication sharedApplication] delegate];


        SLComposeViewController *faceBookPost = [SLComposeViewController     composeViewControllerForServiceType:SLServiceTypeFacebook];

        [faceBookPost setInitialText:@"test"];
        [faceBookPost addURL:[NSURL URLWithString:@"http://www.google.com"]];

        [[app navController] presentModalViewController:faceBookPost animated:YES];
        faceBookPost.completionHandler = ^(SLComposeViewControllerResult result)
        {
            [[CCDirector sharedDirector] resume];
            [[CCDirector sharedDirector] startAnimation];
            [[app navController] dismissModalViewControllerAnimated:YES];
            dogeAmount.string = [NSString stringWithFormat:@"%.2LF", _doge];
            [self setDate];
            NSLog(@"Posted to Facebook");
        };
    } else if (elapsedTime < 24) {
        NSLog(@"%f", elapsedTime);
    }
}

And here is the SetDate that is called in the above: 这是上面调用的SetDate:

-(void)setDate {
    NSString *dateString = [NSDateFormatter localizedStringFromDate:[NSDate date]
                                                          dateStyle:NSDateFormatterShortStyle
                                                          timeStyle:NSDateFormatterFullStyle];
    defaults = [NSUserDefaults standardUserDefaults];
    startTime = [NSDate date];
    calendar = [NSCalendar currentCalendar];
    components = [calendar components:(NSHourCalendarUnit | NSMinuteCalendarUnit) fromDate:startTime];
    hour = [components hour];
    minute = [components minute];
    NSNumber *hourNumber = [NSNumber numberWithInteger:hour];
    NSNumber *minuteNumber = [NSNumber numberWithInteger:minute];
    [defaults setObject:startTime forKey:@"startTime"];
    [defaults setObject:hourNumber forKey:@"hour"];
    [defaults setObject:minuteNumber forKey:@"minute"];
    [defaults setInteger:elapsedTime forKey:@"elapsedTime"];
    NSLog(@"%@",dateString);
    elapsedTime = fabs([startTime timeIntervalSinceNow]);
    [defaults synchronize];
}

I can't figure out what I'm doing wrong here. 我无法弄清楚我在做什么错。

.h 。H

@property (strong, nonatomic) NSDate *dateString;

.m .M

- (void)share
{
    double dateSinceNow = -[self.dateString timeIntervalSinceNow];

    if (dateSinceNow > 24)
    {
        //share to facebook
    }

    self.dateString = [NSDate date];
}

Just save the date: 只需保存日期:

-(void)setStartTime {
    defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:[NSDate date] forKey:@"startTime"];
}

Later retrieve the date: 以后检索日期:

- (BOOL)isTimeExpired {
    defaults = [NSUserDefaults standardUserDefaults];
    NSDate *startedDate = [defaults objectForKey:@"startTime"];
    NSTimeInterval elapsedTime = -[startedDate timeIntervalSinceNow];
    return elapsedTime > 24;
}

Note: NSDate simply is the number of seconds since the first instant of 1 January 2001, GMT. 注意: NSDate只是自格林威治标准时间2001年1月1日的第一个瞬间起经过的秒数。

You are constantly comparing [NSDate date] to now, which will only be the time between the instantiation and now. 您一直在比较[NSDate date]与现在,这仅是实例化与现在之间的时间。 That is the reason it is always small. 这就是它总是很小的原因。

Also, if you want to disable a button, why not disable it and schedule a method to enable it after 24 second delay? 另外,如果要禁用按钮,为什么不禁用它,并计划在24秒延迟后启用它的方法?

Your fundamental problem is that you calculate elapsedTime in your setDate method, but you only call setDate once, immediately after you post Facebook, so elapsedTime is never going to change after that initial setting. 您的根本问题是您在setDate方法中计算了elapsedTime ,但是在发布Facebook之后立即只调用一次setDate ,因此elapsedTime在该初始设置之后将永远不会改变。

I presume that you are also storing the post date in NSUserDefaults so that you can keep track of the value across application launches? 我假设您还将发布日期存储在NSUserDefaults以便可以在应用程序启动时跟踪其值? If so, where do you read the value back in? 如果是这样,您从哪里读回值? In viewDidLoad ? viewDidLoad

I would get rid of the elapsedTime variable and create a postDate @property - 我将摆脱elapsedTime变量,并创建一个postDate @property postDate

@property (strong,nonatomic) NSDate *postDate;

Then, in your viewDidLoad method - 然后,在您的viewDidLoad方法中-

self.postDate=[[NSUserdefaults standardUserDefaults] objectForKey:@"postDateKey"];

Now your postToFaceBook can be - 现在您的postToFaceBook可以是-

-(void)postToFacebook
{
    if (self.postDate ==  nil || [self.postDate timeIntervalSinceNow] > 24) {

        [[CCDirector sharedDirector] pause];
        [[CCDirector sharedDirector] stopAnimation];

        CCAppDelegate *app = (CCAppDelegate*) [[UIApplication sharedApplication] delegate];


        SLComposeViewController *faceBookPost = [SLComposeViewController     composeViewControllerForServiceType:SLServiceTypeFacebook];

        [faceBookPost setInitialText:@"test"];
        [faceBookPost addURL:[NSURL URLWithString:@"http://www.google.com"]];

        [[app navController] presentModalViewController:faceBookPost animated:YES];
        faceBookPost.completionHandler = ^(SLComposeViewControllerResult result)
        {
            [[CCDirector sharedDirector] resume];
            [[CCDirector sharedDirector] startAnimation];
            [[app navController] dismissModalViewControllerAnimated:YES];
            dogeAmount.string = [NSString stringWithFormat:@"%.2LF", _doge];
            self.postDate=[NSDate date];
            [[NSUserDefaults standardDefaults] setObject:self.postDate forKey:@"postDateKey"];
            NSLog(@"Posted to Facebook");
        };
    }
}

The simple way to do this is to get a free timer from the performSelector:afterDelay: method on NSObject,,, 一种简单的方法是从NSObject上的performSelector:afterDelay:方法中获取一个免费计时器。

- (void)disablePosting {
    // set a property that disallows posting, like a bool, or even better
    // do something to the ui that disables, like disabling the button
    self.postingEnabled = NO;
}

- (void)enablePosting {
    self.postingEnabled = YES;
}

Then, to disable for 24 seconds, do this: 然后,要禁用24秒,请执行以下操作:

[self disablePosting];
[self performSelector:@selector(enablePosting) afterDelay:24];

And your FB code looks like this: 您的FB代码如下所示:

if (self.postingEnabled) {
    // do the fb request here, without any references to timeout other than

}

Now you can take all of the other date and elapsedTime related code out. 现在,您可以取出所有其他与date和elapsedTime相关的代码。

One little gotcha, remember to cancel the perform request on dealloc 一个小问题,记住要取消对dealloc的执行请求

- (void)dealloc {
    [NSObject cancelPreviousPerformRequestsWithTarget:self];
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM