我在自定义单元格上运行NSRunLoop
NSTimer
,以便不断更新"有效期至" UILabel
。它工作正常,直到我关闭tableView,NSRunLoop
继续倒计时。我使用dealloc
,但似乎没有排除NSRunLoop
和NSTimer
。
-(void)dealloc {
[[NSNotificationCenter defaultCenter]removeObserver:self];
[_timer invalidate];
CFRunLoopStop(CFRunLoopGetCurrent());
_runner = nil; // NSRunLoop
}
当细胞被释放时,如何杀死NSRunLoop
?提前谢谢。
答案 0 :(得分:2)
使用当前运行循环解决问题会让您遇到各种麻烦。解决问题的最简单方法是在您的单元格上设置NSTimer
属性,并在单元格willDisplay
/ willEndDisplay
时启动/停止该属性。
class CustomCell: UITableViewCell {
var timer: NSTimer?
func startTimer() -> Void {
timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "updateUI:", userInfo: nil, repeats: true)
}
func stopTimer() -> Void {
timer?.invalidate()
timer = nil
}
func updateUI(sender: NSTimer?) -> Void {
// update your label here
}
}
class ViewController: UIViewController, UITableViewDelegate {
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
if let cell = cell as? CustomCell {
cell.startTimer()
}
}
func tableView(tableView: UITableView, didEndDisplayingCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
if let cell = cell as? CustomCell {
cell.stopTimer()
}
}
}