嗨,並提前致謝。我有一個問題,當我在一個視圖中啓動NSTimer
,然後切換到UIPickerView
的另一個視圖時,UIPickerView
的行爲會受到影響。我在任何視圖和包含NSTimer
的視圖之間來回切換的次數越多,UIPickerView
的行爲就會受到越深刻的影響 - 它們會滯後並緩慢移動 - 最終會導致UIPickerView
不會調用DidSelectRow
方法。這不僅僅是一個UIPickerView
受到影響,而是我的應用中的所有UIPickerView
。影響NIPimer行爲的UIPickerView
如果我決定首先不激活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編程相關問題。 – 2012-12-27 07:21:09
好的我一定不要在將來... –