2014-04-21 21 views
5

sonra çekim yaratır zamanlayıcı garip davranır ve aynı yerde saymak için birden fazla zamanlayıcıyı yeniden üretir gibi görünüyor. Bu zamanlayıcıyı kullanırken bunu nasıl düzeltebilirim? kullanarak zamanlayıcı aşağıda gibi zamanlayıcı kullanılarak <a href="https://github.com/mineschan/MZTimerLabel/">https://github.com/mineschan/MZTimerLabel/</a> ve benim Tableview cellForRowAtIndex içinde kullanıyorum herhangi kaydırma veya tablo yeniden yükleme

herhangi bir yardım takdir

,

Elias

+0

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. –

+0

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. –

+0

Özel hücreler kullanıyorsanız, hücreye bir düğme ekleyebilir ve tıklatıp bir zamanlayıcı gösterebilir. – iBug

cevap

8

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.

  1. kurma
  2. tableView yeniler bir NSTimer oluşturun bir başlık ve bir ENDDATE masanızı yedekler modelinde bu sınıfın
  3. 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 

enter image description here

+0

Çok teşekkür ederim. Derslerim çok büyük ve karmaşık, çözümünüzü denemek biraz zaman alıyor. Kullanmaya başlıyorum ve bitirdikten sonra cevap kabul edeceğim. Teşekkürler. –

+0

Harika! Tamamen çalıştı. Çok teşekkür ederim dostum. –

+0

Merhaba Matthias, http://stackoverflow.com/questions/29961244/set-uitableviewcell-contents-only-once adresindeki bir önceki bağlantım aracılığıyla sorunuza yeniden yönlendirildim. Zamanlayıcıyı işe aldım ve iyi çalışıyor. Ancak, zamanlar yalnızca UITableView' içinde yukarı ve aşağı kaydırdığımda yenilenir. Onları gerçek zamanda yenilemelerini sağlamanın bir yolu var mı? Kullanıcı, her saniye süreleri görebiliyor. Bana yardım edersen, bu harika olur. Teşekkürler! – user1871869