如何在 Swift 中使用 NSTimer 和 NSNotificationCentre 更新 UITableViewCells

How to update UITableViewCells using NSTimer and NSNotificationCentre in Swift

注意:请在Swift中寻求答案。

我想做什么:

我目前的表现如何:

我正在尝试什么/可能的解决方案

问题

在此先感谢您的帮助!

正如 Ian MacDonald 所建议的那样,如果您正在滑动,则应避免在计时器滴答作响时重新加载单元格。同时删除 NSNotification,因为它和计时器本质上是在做同样的事情

这可能是一种根本不重新加载单元格的解决方案。只需让单元格收听更新通知并相应地更改其标签即可。 我假设您将 UITableViewCell 子类化并给单元格一个 storedDate 属性。您将在准备单元格时设置 属性。

计时器只会触发通知。

记得在dealloc

的通知中心注销手机

这是一个简单的例子。

包含您的 TableView 的视图控制器:

class ViewController: UIViewController, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!

    var timer: NSTimer!


    //MARK: UI Updates

    func fireCellsUpdate() {
        let notification = NSNotification(name: "CustomCellUpdate", object: nil)
        NSNotificationCenter.defaultCenter().postNotification(notification)
    }

    //MARK: UITableView Data Source

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 10
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cellIdentifier = "CustomCell"
        let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as! CustomTableViewCell
        cell.timeInterval = 20
        return cell
    }

    //MARK: View Lifecycle
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        self.timer = NSTimer(timeInterval: 1.0, target: self, selector: Selector("fireCellsUpdate"), userInfo: nil, repeats: true)
        NSRunLoop.currentRunLoop().addTimer(self.timer, forMode: NSRunLoopCommonModes)
    }


    deinit {
        self.timer?.invalidate()
        self.timer = nil
    }

}

自定义单元格子类:

class CustomTableViewCell: UITableViewCell {

    @IBOutlet weak var label: UILabel!

    var timeInterval: NSTimeInterval = 0 {
        didSet {
            self.label.text = "\(timeInterval)"
        }
    }

    //MARK: UI Updates

    func updateUI() {
        if self.timeInterval > 0 {
            --self.timeInterval
        }
    }

    //MARK: Lifecycle

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code

        let notificationCenter = NSNotificationCenter.defaultCenter()
        notificationCenter.addObserver(self, selector: Selector("updateUI"), name: "CustomCellUpdate", object: nil)
    }

    deinit {
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }

}

我很确定这个例子不符合您应用的逻辑。只是展示事物是如何一起发光的。