2017-01-25 19 views
0

zurückgeben Ich habe eine tableView mit einem Timer in jeder Zelle, die ausgeführt wird, wenn tableView:didSelectRowAtIndexPath aufgerufen wird. Ich versuche, ein Etikett (cellName) in einer benutzerdefinierten Zelle (CustomCell) zu verwenden, um den Timer inkrementieren anzuzeigen. Ich verwende #selector in .scheduledTimer, um eine separate Funktion namens getTimer() aufzurufen, um den Wert zu erhöhen. Code wie folgt.Variable für .scheduledTimer zu TableView Cell in Swift 3

Ich habe diesen Code abgekürzt nur die relevanten Informationen

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 

    var time = 0 


    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

     let cell: CustomCell = tableView.cellForRow(at: indexPath)! as! 
    CustomCell 

     var timer = Timer() 

     timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.getTimer), userInfo:nil, repeats: true) 

     cell.cellName.text = String(self.getTimer()) 


    } 

    func getTimer() -> String { 

     time += 1 
     return String(time) 
    } 
} 

Zwei Dinge zu zeigen:

  1. Meine time Variable wird auf der Ebene der Klassen definiert, so dass getTimer() diese erhöhen können auf jedem .scheduledTimer aktualisieren. Ich möchte es in :didSelectRowAtIndexPath definieren, so dass ich mehrere Timer gleichzeitig ausführen kann. Gibt es eine Möglichkeit, dies in :didSelectRowAtIndexPath zu definieren, und vielleicht erhalten Sie das Ergebnis durch Zurückgeben der Schrittweite von getTimer()?

  2. Derzeit aktualisiere ich meine cellName mit einer Zeichenfolge, die von getTimer zurückgegeben wird. Dies ist statisch und denkt derzeit darüber nach, wie ich es aktualisieren kann, wenn .scheduledTimer aktualisiert wird. Sollte ich vielleicht indexPath.row an getTimer weitergeben und es in der getTimer() Funktion selbst aktualisieren?

+0

Diese Syntax wird nie funktionieren. Es ist nicht möglich, einen Wert von einer Ziel-/Aktionsmethode zurückzugeben. Eine Lösung besteht darin, eine benutzerdefinierte Tabellenansichtszellenklasse zu erstellen und den Timer dort einzufügen. – vadian

+0

Yeah, du hast wahrscheinlich Recht - ich wusste immer, dass ich auf diese Weise an Strohhalmen klammere. Die Implementierung in meiner benutzerdefinierten Zellklasse sollte funktionieren. Ich werde das Ergebnis als eine Antwort hier erstellen, sobald ich es für die Nachwelt ausarbeite. Vielen Dank. – user3526037

+0

Bearbeiten Sie Ihre Frage und fügen Sie den tatsächlichen Code hinzu. – vadian

Antwort

0

Ihre Logik zu dem Problem ist nicht richtig. Ich werde dir eine schnelle Lösung für dein Problem geben. Erstellen Sie zwei Variablen timeArray und timerArray im Klassenbereich

var timeArray = [Int]() 
var timerArray = [Timer]() 

Setzen Sie diesen Code in Ihre viewDidLoad. Ersetzen Sie beim Erstellen des Arrays die Anzahl 1 durch die Anzahl der Zellen in Ihrer Tabellenansicht.

timeArray = Array(repeating: 0, count: 1) 
    let timer = Timer(timeInterval: 1, target: self, selector: #selector(self.timerFired(_:)), userInfo: nil, repeats: true) 
    timerArray = Array(repeating: timer, count: 1) 

In Ihrem didSelectRow Tableview Delegatmethode die

Timer Validierung und Invalidierung Griff
if timerArray[indexPath.row].isValid{ 
     timerArray[indexPath.row].invalidate() 
    } 
    else{ 
     timerArray[indexPath.row] = Timer(timeInterval: 1, target: self, selector: #selector(self.timerFired(_:)), userInfo: indexPath.row, repeats: true) 
     timerArray[indexPath.row].fire() 
    } 

Fügen Sie diese Funktion, die ausgelöst wird erhalten, wenn der Timer ausgelöst wird.

func timerFired(_ timer:Timer){ 
    if let index = timer.userInfo as? Int{ 
     timeArray[index] += 1 
    } 
} 

schließlich in Ihnen cellForRow Datenquelle Methode des Tableview stellen Sie den Beschriftungstext

cell.cellName.text = time[indexPath.row] 

Vergessen Sie nicht, die bestimmte Zelle, wenn die timerFired Funktion neu zu laden.

+0

Ich erhalte den Fehler 'Type '(UnsafeMutablePointer !) -> time_t' hat keine tiefgestellten Mitglieder' ... – user3526037

+0

An welcher Zeile erscheint der Fehler? – ebby94