2012-03-29 12 views
5

Wie gehe ich über diese Aufgabe? Grundsätzlich werde ich ein Array von "Sekunden int" in der UITableView aufgelistet haben. Also wie kann ich jedem "Sekunden int" Countdown auf Null zuweisen? Die möglichen Probleme, die ich sehe, sind die Timer, die nicht aktualisiert werden, wenn die Zelle noch nicht erstellt wurde. Und wie instanziiere ich mehrere unabhängige NSTimers, die verschiedene ui-Elemente aktualisieren? Ich bin hier ziemlich verloren, daher werden alle Vorschläge sehr geschätzt. für optische Zwecke, möchte ich so etwas haben:mehrere Countdown-Timer innerhalb von uitableview

enter image description here

Antwort

8

Aus dem Bild sieht es so aus, als wäre Ihr Modell eine Reihe von Aktionen, die der Benutzer plant. Ich würde die Dinge so arrangieren:

1) MyAction ist ein NSObject mit einem Namen und einem Fälligkeitsdatum. MyAction implementiert etwas wie folgt aus:

- (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 hält ein Handle auf das Modell, das eine NSArray von MyActions ist, hat es auch eine NSTimer (nur eine), die es an der Zeit erzählt ist vorbei.

// 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

danke dude! Wie wird dieses Label (cell.textLabel.text = [myAction timeRemainingString];) bei jedem Tick aktualisiert? Wie nennst du es jede Sekunde? – Diffy

+0

np. Sie werden Ihren View-Controller als "delegate" und "datasource" der Tabelle einrichten (das hätte ich erwähnen sollen). Wenn die Ticks auftreten, bitten Sie Ihre Tabelle, ihre Daten neu zu laden. Der Tisch kümmert sich um den Rest. Es ruft Sie zurück, um zu fragen, wie viele Zellen es laden soll, und um jede Zelle zu konfigurieren - beide Methoden, die in dem von mir bereitgestellten Code beschrieben sind. – danh

+0

okay, ich habe es funktioniert .. jetzt versuche ich zu ändern - (NSString *) timeRemainingString-Methode zu - (NSString *) timeRemainingString: (NSTimeInterval) SekundenRemaining, so dass ich meine Array von Sekunden anstelle eines festen Wertes übergeben kann. Wie behalte ich einen Verweis auf diesen Wert, so dass er jedes Mal, wenn die Tabelle neu geladen wird, 1 Sekunde abzieht? – Diffy

0

Um Phantasie UI-Sachen in der Tabelle so haben, möchten Sie vielleicht UITableViewCell und erstellen Sie einen Timer als Eigenschaft in jeder Unterklasse. Die Zelle kann dann einen Delegierten besitzen, der auf TimerWentOff reagiert und das Klingeln eines Alarms oder einer Benachrichtigung oder dergleichen handhabt. Jeder Timer würde das Etikett in seiner Zelle aktualisieren.

Hoffe, dass hilft ein bisschen. Wenn Sie genauere Fragen haben, lassen Sie es mich wissen.

+0

Danke! Das Erstellen der benutzerdefinierten Zelle ist kein Problem, das habe ich schon. Also, dieser Teil "Die Zelle kann dann einen Delegierten besitzen" ist dies der Teil, der den Countdown-Timer erstellt? Sollte ich die Nstimers in ein Array setzen und auf eine Methode zugreifen, um die Labels in meiner Zelle zu aktualisieren? – Diffy

Verwandte Themen