ОБНОВЛЕНИЕ: Начиная с бета4 проблема все еще существует.
Я создал очень простой пример того, как UIViewController, представленный UIViewControllerRepresentable, никогда не освобождается.
import SwiftUI
struct ContentView : View {
@State private var showRepView = true
var body: some View {
VStack {
Text("Square").font(.largeTitle).tapAction {
self.showRepView.toggle()
}
if showRepView {
SomeRepView().frame(width: 100, height: 100)
}
}
}
}
Представление реализации выглядит следующим образом:
import SwiftUI
struct SomeRepView: View {
var body: some View {
RepViewController()
}
}
struct RepViewController: UIViewControllerRepresentable
{
func makeUIViewController(context: Context) -> SomeCustomeUIViewController {
let vc = SomeCustomeUIViewController()
print("INIT \(vc)")
return vc
}
func updateUIViewController(_ uiViewController: SomeCustomeUIViewController, context: Context) {
}
static func dismantleUIViewController(_ uiViewController: SomeCustomeUIViewController, coordinator: Self.Coordinator) {
print("DISMANTLE")
}
}
class SomeCustomeUIViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.green
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
print("viewWillDissapear \(self)")
}
deinit {
print("DEINIT \(self)")
}
}
Нажатием на кнопку «Квадрат» альтернативно добавляется и удаляется SomeRepView
. Однако связанный UIViewController никогда не выпускается. Это видно по зарегистрированным сообщениям, и я также подтвердил это с помощью Инструментов.
Обратите внимание, что SomeRepView выпущен правильно. Только соответствующий контроллер представления остается выделенным.
Также обратите внимание, что UIViewController.viewWillDissappear
называется, а также UIViewControllerRepresentable.dismantleUIViewController
Это типичный результат повторного нажатия квадратной кнопки.
INIT <SomeCustomeUIViewController: 0x100b1af70>
DISMANTLE
viewWillDissapear <SomeCustomeUIViewController: 0x100b1af70>
INIT <SomeCustomeUIViewController: 0x100a0a8c0>
DISMANTLE
viewWillDissapear <SomeCustomeUIViewController: 0x100a0a8c0>
INIT <SomeCustomeUIViewController: 0x100b23690>
DISMANTLE
viewWillDissapear <SomeCustomeUIViewController: 0x100b23690>
Как показано, DEINIT
никогда не печатается.
Мой вопрос ... это ошибка? Или я что-то не так делаю?
Работает с iOS13, бета-версия 4.
Я попытался вызвать Предупреждение о симуляции памяти . Нет эффекта. Контроллеры сохраняются. Инструменты мой свидетель; -)