Xcode9, swift4でiOSアプリを開発しています。
構成としては、
- FirstViewController(遷移元)
- SecondViewController(遷移先, tableView)
があり、SecondViewController
のtableView
とcell
をStoryboardで作成しています。
cell上には自分で作成したTestView
を乗せ、Tagを設定しcell生成時に取得しています。
このTestView
もStoryboardとXibで作成し、Timerを持っています。
swift
1 2import UIKit 3 4class TestView: UIView { 5 6 var timer: Timer? 7 let timerInterval: TimeInterval = 60 8 9 override init(frame: CGRect) { 10 super.init(frame: frame) 11 loadXib("TestView") 12 } 13 14 required init(coder aDecoder: NSCoder) { 15 super.init(coder: aDecoder)! 16 loadXib("TestView") 17 } 18 19 fileprivate func loadXib(_ nibName: String) { 20 let bundle = Bundle(for: type(of: self)) 21 let nib = UINib(nibName: nibName, bundle: bundle) 22 let view = nib.instantiate(withOwner: self, options: nil).first as! UIView 23 addSubview(view) 24 25 view.translatesAutoresizingMaskIntoConstraints = false 26 let bindings = ["view": view] 27 addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[view]|", options:NSLayoutFormatOptions(rawValue: 0), metrics:nil, views: bindings)) 28 addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[view]|", options:NSLayoutFormatOptions(rawValue: 0), metrics:nil, views: bindings)) 29 } 30 31 override func didAddSubview(_ subview: UIView) { 32 super.didAddSubview(subview) 33 setTimer() 34 } 35 36 override func removeFromSuperview() { 37 // 呼ばれない 38 timer?.invalidate() 39 } 40 41 func setTimer() { 42 timer = Timer.scheduledTimer(timeInterval: timerInterval, target: self, selector: #selector(self.update), userInfo: nil, repeats: true) 43 timer?.fire() 44 } 45 46 @objc func update(tm: Timer) { 47 print("hello") 48 } 49 50} 51
cellの生成部分のコードは下記です。
swift
1extension SecondViewController: UITableViewDelegate, UITableViewDataSource { 2 // 省略 3 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 4 var cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "testCell", for: indexPath) 5 if let testView: TestView = cell.viewWithTag(1) as? TestView { 6 print("add TestView") 7 } 8 return cell 9 } 10 // 省略 11}
###発生している問題
cellも正しく追加され、60秒毎のtimerによる処理は問題無く行われるのですが、SecondViewController
からFirstViewController
へ戻った際にremoveFromSuperview()
が呼ばれず、Timerが動き続けてしまいます。
cell上のviewを開放するにはどうしたらよいか、アドバイスいただけますでしょうか。
以上、よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/22 02:16 編集
2017/11/22 02:26
2017/11/22 02:32