Ben MZTimerLabel
bir göz vardı ve kötü MVC ihlal ediyor. Modele ait bir şeyi (zamanın tersi olan zamanlayıcı) görünüme sokar. Problemin nereden geldi? Görünümler, model üzerinde yan etkiler olmadan yeniden oluşturulmalıdır.
Bu sınıfa hendek atmanızı ve kendi yaratmanızı tavsiye ederim. Aslında böyle bir şey elde etmek oldukça kolay.
-
- kurma
tableView yeniler
bir NSTimer oluşturun bir başlık ve bir ENDDATE masanızı yedekler modelinde bu sınıfın
- Mağaza örnekleri kaydeder yeni bir sınıf yaratın hücreler.
Temel olarak bir tablodaki temel geri sayım için gereken tüm kodlar. o görünümde herhangi bir veri depolamak olmadığından sizin kadar istediğiniz gibi ilerleyebilirsiniz:
@interface Timer : NSObject
@property (strong, nonatomic) NSDate *endDate;
@property (strong, nonatomic) NSString *title;
@end
@implementation Timer
@end
@interface MasterViewController() {
NSArray *_objects;
NSTimer *_refreshTimer;
}
@end
@implementation MasterViewController
- (void)viewDidLoad
{
[super viewDidLoad];
NSMutableArray *modelStore = [NSMutableArray arrayWithCapacity:30];
for (NSInteger i = 0; i < 30; i++) {
Timer *timer = [[Timer alloc] init];
timer.endDate = [NSDate dateWithTimeIntervalSinceNow:i*30];
timer.title = [NSString stringWithFormat:@"Timer %ld seconds", (long)i*30];
[modelStore addObject:timer];
}
_objects = modelStore;
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[_refreshTimer invalidate]; // timer should not exist, but just in case.
_refreshTimer = [NSTimer timerWithTimeInterval:0.5f target:self selector:@selector(refreshView:) userInfo:nil repeats:YES];
// should fire while scrolling, so we need to add the timer manually:
[[NSRunLoop currentRunLoop] addTimer:_refreshTimer forMode:NSRunLoopCommonModes];
}
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
[_refreshTimer invalidate];
_refreshTimer = nil;
}
- (void)refreshView:(NSTimer *)timer {
// only refresh visible cells
for (UITableViewCell *cell in [self.tableView visibleCells]) {
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
[self configureCell:cell forRowAtIndexPath:indexPath];
}
}
#pragma mark - Table View
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return _objects.count;
}
- (void)configureCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
Timer *timer = _objects[indexPath.row];
cell.textLabel.text = timer.title;
NSInteger timeUntilEnd = (NSInteger)[timer.endDate timeIntervalSinceDate:[NSDate date]];
if (timeUntilEnd <= 0) {
cell.detailTextLabel.text = @"Finished";
}
else {
NSInteger seconds = timeUntilEnd % 60;
NSInteger minutes = (timeUntilEnd/60) % 60;
NSInteger hours = (timeUntilEnd/3600);
cell.detailTextLabel.text = [NSString stringWithFormat:@"%02ld:%02ld:%02ld", (long)hours, (long)minutes, (long)seconds];
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
[self configureCell:cell forRowAtIndexPath:indexPath];
return cell;
}
@end
Ne elde etmek istiyorsunuz? TableView: cellForRowAtIndexPath: 'her hücre çağrıldığında her zaman çağrılacak çünkü orada bir zamanlayıcı kullanmamalısınız. –
TableviewCell'de bir yükseltme butonum var ve kullanıcı butona dokunduğunda butonu geri sayım sayacı ile değiştirmeliyim. Ayrıca, verilerin bir web servisinden geldiği için listenin yeniden yüklenmesi gerekir. –
Özel hücreler kullanıyorsanız, hücreye bir düğme ekleyebilir ve tıklatıp bir zamanlayıcı gösterebilir. – iBug