Вот ответ, который может быть полезен.
UITableViewCells существуют только на экране.Так что вы испытываете ожидаемое поведение.По сути, вам понадобятся таймеры вне области действия UITableViewCell, иначе они будут уничтожены, когда они исчезнут с экрана.Итак, вот как вы могли бы сделать это:
Создайте подкласс UITableVIew как таковой (вы должны использовать этот класс вместо TableViewController, который вы используете в данный момент, или просто добавить код, который будет позже, к вашему текущему классу TableViewController):
class HeXiaoManTableViewController: UITableViewController {
}
В этом подклассе создайте массив (или структуру данных по вашему выбору) для хранения таймеров.Я предполагаю, что вы используете NSTimer, но это будет работать для любого класса таймера.
class HeXiaoManTableViewController: UITableViewController {
public var timerArray: [NSTimer] = []
}
Теперь, когда вы создаете ячейки, добавьте новый таймер в массив.Для массива я храню UITableViewCell в массиве в соответствии с его индексом.Таким образом, первый UITableViewCell (индекс 0) будет помещен в индекс 0 массива ... Но, скажем, пользователь прокручивает вверх и вниз, показывая эту первую ячейку несколько раз.Я предполагаю, что вы хотите, чтобы таймер запускался только один раз.Поэтому вам нужно проверить, существует ли таймер.Если это так, то оставьте это в покое.В противном случае добавьте таймер.Вы можете настроить его в соответствии с желаемыми функциями:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var timer = NSTimer()
timer(timeInterval: 0.01, target: self, selector: update, userInfo: nil, repeats: false)
if (timerArray.indices.contains(index)) {
timerArray.insert(timer, at: index)
}
}
Вы сможете получить доступ к этому массиву позднее, чтобы получить отдельные таймеры.Надеюсь, что это помогло!
Редактировать: изменения, внесенные в ваши классы
TimerTableViewCell.swift
import UIKit
class TimerTableViewCell: UITableViewCell {
public var timeInLabel: Int = -1
public var viewController: ViewController?
var index: Int = -1
var timer:Timer?
var tableView: UITableView? {
var view = self.superview
while (view != nil && view!.isKind(of: UITableView.self) == false) {
view = view!.superview
}
return view as? UITableView
}
@IBOutlet weak var timerName: UILabel!
@IBOutlet weak var secondLeftLabel: UILabel!
@IBAction func stopButton(_ sender: UIButton) {
timer?.invalidate()
}
@IBAction func playButton(_ sender: UIButton) {
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: (#selector(updateTimer)), userInfo: nil, repeats: true)
RunLoop.current.add(self.timer!, forMode: RunLoopMode.commonModes)
}
@objc func updateTimer() {
var timeInLabel = Int(secondLeftLabel.text!)!
timeInLabel -= 1
viewController?.timerArray[index] = timeInLabel
secondLeftLabel.text = String(timeInLabel)
}
}
ViewController.swift
import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UIGestureRecognizerDelegate {
public var timerArray: [Int] = []
var myTimerList = CustomTimerList()
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
for timer in CustomTimerList.timerList {
timerArray.append(timer.timerSecond)
}
super.viewDidLoad()
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return CustomTimerList.timerList.count
}
var selectedIndexArray:[Int] = []
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "customCell", for: indexPath) as! TimerTableViewCell
cell.timer?.invalidate()
let item = CustomTimerList.timerList[indexPath.row]
cell.timerName.text = item.timerName
cell.secondLeftLabel.text = "\(timerArray[indexPath.row])"
cell.index = indexPath.row
cell.viewController = self
return cell
}
}