gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:50:50 26 4
gpt4 key购买 nike

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

我正在尝试做的事情:

  • 让表格 View 单元格每 1 秒更新一次并显示实时倒计时。

我目前是怎么做的:

  • 我有一个包含标签的单元格的表格 View 。

  • 生成单元格后,它们会调用一个函数来计算今天和存储的目标日期之间的时间,并在标签中显示剩余的倒计时时间。

  • 为了让细胞每秒更新一次标签,我使用每秒重新加载 tableview 的 NSTimer

  • 问题:倒计时有效,但是当我尝试执行滑动删除操作时,因为 NSTimer 重新加载了 tableview,它重置了刷过的单元格使其不再被刷过,当然这对于最终用户来说是不能接受的。

我正在尝试的/潜在的解决方案

  • 我听说更好的方法是使用由 NSTimer 触发的 NSNotificationCenter 并向每个单元格添加监听器。每 1 秒从 NSNotificationCenter 发送一次“广播”,单元将接收“广播”并更新标签。

  • 我尝试在生成新单元格的代码部分为每个单元格添加一个监听器:

    // Generate the cells

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    var cell = tableView.dequeueReusableCellWithIdentifier("Tablecell", forIndexPath: indexPath) as UITableViewCell
    let countdownEntry = fetchedResultController.objectAtIndexPath(indexPath) as CountdownEntry

    // MARK: addObserver to "listen" for broadcasts
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "updateCountdownLabel", name: mySpecialNotificationKey, object: nil)

    func updateCountdownLabel() {
    println("broadcast received in cell")
    if let actualLabelCountdown = labelCountdown {
    // calculate time between stored date to today's date
    var countdownValue = CountdownEngine.timeBetweenDatesRealTime(countdownEntry.date)
    actualLabelCountdown.text = countdownValue
    }
    }
  • 但观察者的选择器似乎只能定位 View Controller 级别的函数,而不能定位单元格中的函数。 (我无法从单元格内触发“updateCountdownLabel”。当我在 View Controller 级别创建同名函数时,可以调用该函数)

问题

  • 所以我的问题是:这是正确的方法吗?
  • 如果是,我怎样才能让监听器在单元级别触发函数?
  • 如果不是,那么在不中断 Swipe on Cell 操作的情况下实现这种实时倒计时的最佳方法是什么?

预先感谢您的帮助!

最佳答案

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

计时器只会触发通知。

记得在dealloc

中从通知中心注销cell

这是一个简单的肮脏的例子。

包含您的 TableView 的 View Controller :

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)
}

}

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

关于ios - 如何在 Swift 中使用 NSTimer 和 NSNotificationCentre 更新 UITableViewCells,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28534518/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com