0

NSTimeIntervalそのため、ユーザーが入力したタスクから取得するタイマーがあります。タイマーは NSDateComponents クラスを使用して、timeinterval をHH:MM:SSフォーマットに分割します。なんらかの理由で、HH:MM:SSタイマー セレクターが送信されるたびにラベル (フォーマットを持つ) が更新されません。毎秒NSLogメッセージが送信されるため、セレクターが機能することはわかっていますが、ラベルは更新されません。理由はありますか?

TimerViewController.h

@interface DetailViewController : UIViewController{
    NSCalendar *gregorianCalendar;
    NSDateComponents *components;
}
@property (weak, nonatomic) IBOutlet UILabel *timeLeft;
@property (weak, nonatomic) IBOutlet UILabel *timerLabel;
@property (nonatomic, strong) Tasks *testTask;
@property NSTimer *timer;
@property (strong, nonatomic) NSDate *now;
@property (strong, nonatomic) NSDate *date1;
-(void)timerAction:(NSTimer *)t;
@end

TimerViewController.m

 - (void)viewDidLoad
{
    [super viewDidLoad];
    gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
   timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];
    [timer fire];
    self.date1 = [NSDate dateWithTimeInterval:[testTask timeInterval] sinceDate:[NSDate date]];
}
-(void)timerAction:(NSTimer *)t{
   NSDateFormatter *timerFormatter = [[NSDateFormatter alloc]init];
    [timerFormatter setDateFormat:@"hh:mm:ss"];
     NSDate *now = [NSDate date];
    components = [gregorianCalendar components:NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit  fromDate:now toDate:self.date1 options:0];

    NSString *timeRemaining = nil;
    if([now compare:self.date1] == NSOrderedAscending){
        timeRemaining = [NSString stringWithFormat:@"%02d:%02d:%02d", [components hour], [components minute], [components second]];
        NSLog(@"works %@", timeRemaining);
    } else {
        timeRemaining = [NSString stringWithFormat:@"00:00:00"];
        [timer invalidate];
        timer = nil;
        NSLog(@"ended");
    }
   timerLabel.text = timeRemaining;
    [timerLabel setNeedsDisplay];
    [self.view setNeedsDisplay];
}

エラーメッセージ:

*** -[__NSCFCalendar components:fromDate:toDate:options:]: toDate cannot be nil
I mean really, what do you think that operation is supposed to mean with a nil toDate?
An exception has been avoided for now.
A few of these errors are going to be reported with this complaint, then further violations will simply silently do whatever random thing results from the nil.
Here is the backtrace where this occurred this time (some frames may be missing due to compiler optimizations):
(
    0   CoreFoundation                      0x015bdc78 -[__NSCFCalendar components:fromDate:toDate:options:] + 200
    1   ToDoTasks                           0x0000980b -[DetailViewController timerAction:] + 299
    2   CoreFoundation                      0x0160bff6 -[__NSCFTimer fire] + 150
    3   ToDoTasks                           0x00009393 -[DetailViewController viewDidLoad] + 435
    4   UIKit                               0x002e11c7 -[UIViewController loadViewIfRequired] + 536
    5   UIKit                               0x002e1232 -[UIViewController view] + 33
    6   UIKit                               0x002e14da -[UIViewController contentScrollView] + 36
    7   UIKit                               0x002f88e5 -[UINavigationController _computeAndApplyScrollContentInsetDeltaForViewController:] + 36
    8   UIKit                               0x002f89cb -[UINavigationController _layoutViewController:] + 43
    9   UIKit                               0x002f8c76 -[UINavigationController _updateScrollViewFromViewController:toViewController:] + 254
    10  UIKit                               0x002f8d71 -[UINavigationController _startTransition:fromViewController:toViewController:] + 72
    11  UIKit                               0x002f989b -[UINavigationController _startDeferredTransitionIfNeeded:] + 386
    12  UIKit                               0x002f9e93 -[UINavigationController pushViewController:transition:forceImmediate:] + 1030
    13  UIKit                               0x002f9a88 -[UINavigationController pushViewController:animated:] + 62
    14  ToDoTasks                           0x00006acf -[ToDoTableViewController tableView:didSelectRowAtIndexPath:] + 1567
    15  UIKit                               0x002af285 -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 1194
    16  UIKit                               0x002af4ed -[UITableView _userSelectRowAtPendingSelectionIndexPath:] + 201
    17  Foundation                          0x00cb95b3 __NSFireDelayedPerform + 380
    18  CoreFoundation                      0x0156d376 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 22
    19  CoreFoundation                      0x0156ce06 __CFRunLoopDoTimer + 534
    20  CoreFoundation                      0x01554a82 __CFRunLoopRun + 1810
    21  CoreFoundation                      0x01553f44 CFRunLoopRunSpecific + 276
    22  CoreFoundation                      0x01553e1b CFRunLoopRunInMode + 123
    23  GraphicsServices                    0x0260f7e3 GSEventRunModal + 88
    24  GraphicsServices                    0x0260f668 GSEventRun + 104
    25  UIKit                               0x001ffffc UIApplicationMain + 1211
    26  ToDoTasks                           0x00001fad main + 141
    27  ToDoTasks                           0x00001ed5 start + 53
)
2013-07-05 18:00:51.452 ToDoTasks[30968:c07] ended
4

2 に答える 2

1

値を更新するには、ビューを再描画する必要があります

このような:

    [self.superview setNeedsDisplay];

これをチェックしてください:iosでビューを再描画する

したがって、あなたの問題は、時間間隔が変化していないことです。これを使用してください:

日付の保存を開始する場所:

NSDate *then = [NSDate now];//gives you the current time 

アクションが実行されたら、次の日付を保存します。

NSDate *now = [NSDate now]; 

次に、時間間隔を取得します。

NSTimeInterval secondsBetween = [now timeIntervalSinceDate:then];
于 2013-07-06T00:19:43.220 に答える
1

プロパティdate1を作成して行う

self.date1 = [NSDate dateWithTimeInterval:[testTask timeInterval] sinceDate:now];

内部viewDidLoad。そうすれば、時差は実際に減少します。

以下から編集します。

日付をプロパティメソッドにしないでください。最初の編集からnow元に戻してください。timerAction

編集2:

でワークフローを変更しますviewDidLoad。最初に設定self.date1し、次にタイマーをスケジュールします。

于 2013-07-06T00:38:10.580 に答える