こんにちは、よろしくお願いします。あるビューでを開始してNSTimer
から で別のビューに切り替えると、UIPickerView
のUIPickerView
動作が影響を受けるという問題があります。任意のビューと を含むビューの間を行き来するNSTimer
ほど、 の動作に深刻なUIPickerView
影響が及びます。それらは遅れて動きが鈍くなり、最終的に がメソッドUIPickerView
を呼び出さないポイントに到達します。影響を受けているDidSelectRow
のは 1 つだけではなく、私のアプリのすべてです。UIPickerView
UIPickerView
NSTimer
そもそもをアクティベートしないことにした場合UIPickerViews
、問題なく動作します。ただし、メソッドを呼び出すと、を含むビューと他のビューNSTimer
の間で 6 回前後に切り替えた後、アプリはすべて完全に動作しなくなります。適切な動作を復元するには、アプリをシャットダウンして再起動する必要があります。NSTimer
UIPickerView
私は使用してARC
いるので、手動でリリースしていませんが、NSTimer
これは私の問題と関係があると思います。. . NSTimer
_ とにかく、これは何かをコーディングする 2 回目の作業なので、この問題を修正する方法がわかりません。 とが同じまたはスレッドを介して割り当てられる可能性があることNSTimer
を読んだことがNSTimer
ありますが、それが何を意味するのかはよくわかりません。UIPickerView
NSRunLoop
とにかく、ここに私のコードがあります - そのかなり一般的なボイラープレートコードです。
-(void)showActivity:(NSTimer *)tim {
NSDate *currentDate = [NSDate date];
NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:startDate];
NSDate *timerDate = [NSDate dateWithTimeIntervalSince1970:timeInterval];
NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"HH:mm:ss.S"];
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]];
NSString* timeString = [dateFormatter stringFromDate:timerDate];
stopWatchLabel.text = timeString;
}
- (IBAction)onStartPressed:(UIButton *)sender; {
stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1/10
target:self
selector:@selector(showActivity:)
userInfo:nil
repeats:YES];
// Save the new start date every time
startDate = [[NSDate alloc] init]; // equivalent to [[NSDate date] retain];
NSDate *savedMentionDate = [[NSUserDefaults standardUserDefaults] objectForKey:@"mostRecentMentionDate"];
if (savedMentionDate == nil) {
//There is no existing mention, so save the most recent one
[[NSUserDefaults standardUserDefaults]setObject:startDate forKey:@"mostRecentMentionDate"];
[[NSUserDefaults standardUserDefaults] synchronize];
} else {
startDate = savedMentionDate;
}
[stopWatchTimer fire];
timerSetting = 0;
NSNumber* timerSettingNS = [[NSNumber alloc] initWithInt:timerSetting];
[[NSUserDefaults standardUserDefaults] setObject:timerSettingNS forKey:@"timerSetting"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
- (IBAction)onStopPressed:(UIButton *)sender {
[stopWatchTimer invalidate];
}
- (IBAction)resetTimer:(UIButton *)sender; {
stopWatchLabel.text = @"00:00:00.0";
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
[defaults removeObjectForKey:@"mostRecentMentionDate"];
timerSetting = 1;
NSNumber* timerSettingNS = [[NSNumber alloc] initWithInt:timerSetting];
[[NSUserDefaults standardUserDefaults] setObject:timerSettingNS forKey:@"timerSetting"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
-(void)ViewDidLoad {
...
...
NSNumber* timerSettings = [defaults objectForKey:@"timerSetting"];
if (timerSettings == nil || timerSettings.intValue == 1) {
[self resetTimer:resetTime];
} else if (timerSettings.intValue == 0) {
[self onStartPressed:start];
}
}