My Swift 3 iOS App 3つのChildViewを持つTabBarControllerを継承するLoginViewControllerから開始し、それぞれがViewControllerのrootViewであるNavigationControllerです。Swift 3 TableViewControllerが初期化されない
1つのViewControllerには、LoginViewControllerに対してunwindSegueを実行するログアウトボタンが含まれています。
もう1つ(これは重要です)には2つのコンテナビューがあり、そのうちの1つはTableViewControllerです。 TableViewControllerは、バックエンドのデータで動的に埋められます。
バックエンドが私に0のデータを与えるとき、すべて正常に動作します。ログアウトボタンを押すと、すべてのViewControllerとContainerViewsとTableViewがdeinit()を正しく取得します。
TableViewControllerがバックエンドからデータを取得してセルを表示するとすぐに、TableViewControllerに対してdeinit()を呼び出しません。
何が原因でしょうか?私は要求に応じてコードを共有することができます。
私がこれまでに試したこと: 私は閉鎖が存在するあらゆるところで未所有の自己を使用しようとしました。今私は@エスケープでデータを取得するこの部分についてはわかりません:
func loadMyMessages()
{
let myMessagesURL = "https://www.thewebsite.com/rest/messages/mine"
self.tableView.isHidden = true
if let url = URL(string: myMessagesURL) {
self.updateFeedFilter(url, filter: self.activeFilter, hashTag: activeHashTags, completion: { [unowned self] (feed) -> Void in
self.feed?.items.removeAll()
self.feed = feed
})
}
}
func updateFeedFilter(_ url: URL, filter: String, hashTag: String, completion: @escaping (_ feed: Feed?) -> Void) {
let sid = self.prefs.string(forKey: "sid")
let headers2: HTTPHeaders = [
"lastId": "0",
"sid": sid!,
"filter": filter,
"hashTags": hashTag
]
Alamofire.request(url, method: .get, encoding: JSONEncoding.default, headers: headers2)
.responseJSON { [unowned self] response in
print(response)
guard let responseError = response.result.error else {
let feed = Feed(data: response.data!, sourceURL: url)
OperationQueue.main.addOperation({() -> Void in
completion(feed)
self.scrollToFirstRow()
self.tableView.isHidden = false
self.delegateClicked?.stopIndicator()
})
return
}
self.showNoInternetDialog()
self.delegateClicked?.stopIndicator()
}
}
私は何か助けに感謝します!
一般的には、強い参照サイクルの問題をチェックする必要があります。これは、クロージャーや他の参照型オブジェクトのreleshenshipsによって引き起こされる可能性があります。 – Dasem
これは私が最初にチェックしたものです。私はすべての私の代議員を弱くし、私の閉鎖はすべて無用にしました。私はコード例に示されているエスケープクロージャについてはわかりません。それは問題だろうか? –