viewController没有被正确删除?

时间:2017-05-14 18:42:03

标签: ios swift

在我的viewController中,我有NSFetchedResultsController来填充tableView。在viewDidLoad()我将当前时间保存到变量中,然后在NSFetchedResultsController's didChange AnyObject回调中将其打印出来:

class MyViewController: UIViewController, NSFetchedResultsControllerDelegate {
    var date: Date!
    var fetchedResultsController: NSFetchedResultsController<Event>!

    override func viewDidLoad() {
        super.viewDidLoad()
        date = Date()
    }

    func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
        switch type {
        case .insert:
            feedTable.insertRows(at: [newIndexPath!], with: .fade)
            print(date)
        default:
            break
    }
}

我注意到,当我离开这个视图然后回来时,这个回调被调用两次,并且我第一次在视图中的日期被打印以及新的:

  

2017-05-14 18:29:42 +0000

     

2017-05-14 18:30:01 +0000

我将视图放在一个单独的函数中:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "HomePage") as? HomeVC
controller?.managedObjectContext = self.managedObjectContext
self.present(controller!, animated: true, completion: nil)

为什么即使在我离开并回来之后,MyViewController似乎仍然存在?我离开它的方式是不是正确删除它?

2 个答案:

答案 0 :(得分:2)

  

我将视图放在一个单独的函数中:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "HomePage") as? HomeVC
controller?.managedObjectContext = self.managedObjectContext
self.present(controller!, animated: true, completion: nil)
是的,这就是问题所在。您不是返回到现有的HomeVC,而是制作一个新的 HomeVC并在您自己之上展示 。所以你只是继续堆积视图控制器。

回到家里需要做的就是放松你到达这里所做的一切。如果present,现在为dismiss。如果push,现在为pop

答案 1 :(得分:0)

“离开视野”是什么意思 你回去了吗?如果你是,那么deinit就没有被召唤。

通过执行以下操作进行测试。

ImageButton button = (ImageButton) findViewById(R.id.button);
GradientDrawable backgroundGradient = (GradientDrawable) button.getBackground();
backgroundGradient.setStroke(5, Color.RED);  // set stroke width and stroke color

如果您在返回时未调用此项,则表示存在保留周期问题。