2015-11-11 129 views
0

我在自定義單元格上運行NSRunLoopNSTimer,以便不斷更新「有效期」UILabel。它工作正常,直到我關閉tableView,NSRunLoop繼續倒計時。我使用dealloc,但似乎不排水NSRunLoopNSTimeriOS:自定義單元格上的NSRunLoop

-(void)dealloc { 

    [[NSNotificationCenter defaultCenter]removeObserver:self]; 
    [_timer invalidate]; 
    CFRunLoopStop(CFRunLoopGetCurrent()); 
    _runner = nil; // NSRunLoop 
} 

當細胞獲得釋放時,我怎樣才能殺死NSRunLoop?先謝謝你。

+2

我不會_dare_以這種方式使用NSRunLoop。你只是在問問題。 – gnasher729

+0

我對此聲明投了票。 – NCFUSN

回答

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

}