2017-05-14 54 views
0

在我的viewController中,我有一個NSFetchedResultsController用於填充tableView。在viewDidLoad()我保存當前時間的變量,然後打印出來的NSFetchedResultsController'sdidChange AnyObject回調:viewController沒有被正確刪除?

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年5月14日18時29分42秒0000

2017年5月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似乎要堅持即使我離開它回來?我離開它的方式不能正確刪除它嗎?

+0

不要忘記在'viewDidLoad'方法中調用'super'。 –

+0

我是,只是沒有在這個問題中包括它 – MarksCode

+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

+0

因此,要使用「MyViewController」,我使用HomeVC中的同一種故事板實例。你說如果我只是解僱,那麼它應該帶我回家嗎? – MarksCode

0

你是什麼意思「離開視圖」 你回去了嗎?如果你是,那麼deinit不會被調用。

通過執行以下操作進行測試。

deinit { 
    print("VC Should deinitialize") 
} 

如果當你回去時不會調用這個函數,那麼你有一個保留週期問題。