2012-03-29 15 views
5

Jak wykonać to zadanie? Zasadniczo, będę mieć tablicę "sekund int" wymienionych wewnątrz UITableView. Jak więc przypisać każde "sekundy int" do odliczania do zera? Możliwe problemy, które widzę, to nieaktualizowanie liczników, gdy komórka nie jest jeszcze utworzona. I jak utworzyć instancję wielu niezależnych NSTimerów aktualizujących różne elementy interfejsu użytkownika? Jestem tu dość zagubiony, więc wszelkie sugestie są mile widziane. w celach wizualnych, chcę mieć coś takiego:wiele timerów odliczania wewnątrz uitableview

enter image description here

Odpowiedz

8

Z obrazu wygląda na to, że model to zestaw działań, które użytkownik planuje podjąć. Ułożyłbym wszystko w ten sposób:

1) MojaAkcja jest zbiorem NSO z nazwą i terminem. MyAction realizuje coś takiego:

- (NSString *)timeRemainingString { 
    NSDate *now = [NSDate date]; 
    NSTimeInterval secondsLeft = [self.dueDate timeIntervalSinceDate:now]; 
    // divide by 60, 3600, etc to make a pretty string with colons 
    // just to get things going, for now, do something simple 
    NSString *answer = [NSString stringWithFormat:@"seconds left = %f", secondsLeft]; 
    return answer; 
} 

2) StatusViewController utrzymuje uchwyt do modelu będącego NSArray od MyActions, ma też NSTimer (tylko jeden), który informuje go czas przemija.

// schedule timer on viewDidAppear 
// invalidate on viewWillDisappear 

- (void)timerFired:(NSTimer *)timer { 
    [self.tableView reloadData]; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return self.model.count; 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    MyAction *myAction = [self.model objectAtIndex:indexPath.row]; 

    // this can be a custom cell. to get it working at first, 
    // maybe start with the default properties of a UITableViewCell 

    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 

    cell.textLabel.text = [myAction timeRemainingString]; 
    cell.detailTextLabel.text = [myAction name]; 
} 
+0

dzięki stary! w jaki sposób ta etykieta (cell.textLabel.text = [myAction timeRemainingString];) będzie aktualizowana przy każdym tiku? jak nazywasz to co sekundę? – Diffy

+0

np. ustawisz kontroler widoku na "delegata" i "źródło danych" tabeli (powinienem to wspomnieć). gdy pojawią się tyknięcia, poprosisz stolik o ponowne załadowanie danych. stół zajmie się resztą. oddzwoni do Ciebie, aby zapytać, ile komórek ma załadować, i skonfigurować każdą komórkę - obie metody opisane w dostarczonym kodzie. – danh

+0

OK, mam to działa .. teraz próbuję zmienić twoją - (NSString *) metodę timeMemishingString na - (NSString *) timeRemainingString: (NSTimeInterval) secondsZawiera, żebym mógł przekazać moją tablicę sekund zamiast ustalonej wartości. Jak zachować referencję tej wartości, aby odliczała 1 sekundę za każdym razem, gdy tabela jest ponownie ładowana? – Diffy

0

mieć fajne rzeczy UI w tabeli takiego, może chcesz podklasy UITableViewCell i stworzyć czasomierz jako właściwość w każdym. Komórka może wtedy posiadać delegata, który odpowiada na TimerWentOff i obsługuje dzwonienie alarmu, powiadomienia lub czegokolwiek innego. Każdy zegar aktualizowałby etykietę w jej komórce.

Mam nadzieję, że trochę pomaga. Jeśli masz więcej szczegółowych pytań, daj mi znać.

+0

Dzięki! Tworzenie niestandardowej komórki nie stanowi problemu, już to mam. A więc ta część "Komórka może wtedy być właścicielem delegata" to jest część, która tworzy zegar odliczający? Czy powinienem wstawić nstimery do tablicy i uzyskać dostęp do jednej metody aktualizacji etykiet w mojej komórce? – Diffy

Powiązane problemy