안녕하세요. 미리 감사드립니다. 하나의보기에서 NSTimer
을 시작한 다음 UIPickerView
과 함께 다른보기로 전환하면 UIPickerView
의 동작이 영향을받습니다. NSTimer
을 포함하는보기와보기간에 전환할수록 UIPickerView
의 동작이 영향을받습니다. 지연되고 느리게 이동하여 결국 UIPickerView
이 DidSelectRow
메서드를 호출하지 않는 지점으로 이동합니다. 영향을 받고있는 것은 UIPickerView
뿐 아니라 내 앱에있는 UIPickerView
입니다.UIPickerView의 동작에 영향을 미치는 NSTimer
처음에 NSTimer
을 활성화하지 않기로 결정하면 내 UIPickerViews
이 문제없이 작동합니다. 그러나 NSTimer
메서드를 호출하면 NSTimer
이 포함 된보기와 다른보기가 여섯 번 반복되는보기 사이에 네 번 전환 한 후 내 앱 UIPickerView
이 완전히 작동하지 않습니다. 그들의 적절한 행동을 복원하기 위해 나는 응용 프로그램을 종료하고 다시 시작해야합니다.
저는 ARC
을 사용하고 있습니다. 따라서 수동으로 NSTimer
을 풀어주지는 않습니다. 그러나 이것은 제 문제와 관련이 있다고 생각합니다. 나는 NSTimer
을 포함하는보기로 다시 전환 할 때마다 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];
}
}
'xcode'태그를 남용하지 마십시오. 일반적인 iOS 프로그래밍 관련 질문에 적합합니다. –
좋아요. 나중에 확인하지 않겠습니다. –