ios-UIViewControllerRepresentable反复实例化视图控制器
发布时间:2022-03-18 18:33:52 552
相关标签: # android
我是iOS开发新手。在用Java在Android上开发了一款应用程序后,我决定在iOS上开发,然而,我几乎立刻就开始面临内存泄漏的问题。。。所以,我制作了一个带有故事板的ViewController,并试图通过点击按钮在SwiftUI视图中显示它。代表性:
import UIKit
import SwiftUI
struct StartTraining: UIViewControllerRepresentable{
func makeUIViewController(context: UIViewControllerRepresentableContext) -> UIViewController {
let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
let controller = storyboard.instantiateViewController(identifier: "StartTraining")
return controller
}
func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext) {
//I'm not updating anything, I just need to show the ViewController and everything will be done there
}
}
SwiftUI视图:
struct WorkoutDescriptionView: View {
@State private var isPresented = false
var body: some View {
Button(action: {
self.isPresented = true
}, label: {
Text("Start")
.bold()
.font(.title2)
.frame(width: 350, height: 50)
.background(Color.green)
.foregroundColor(.white)
.cornerRadius(10)
})
.padding(.bottom).fullScreenCover(isPresented:$isPresented){
StartTraining().ignoresSafeArea()
}
}
而且很有效!当我点击按钮时,我确实可以看到ViewController全屏显示,然而,ViewController中确实发生了很多事情,一旦我点击,内存使用量增加了200 MB,当我想返回到在ViewController中点击按钮时以SwiftUI编写的主菜单时,只释放了20 MB的内存使用量,你可以看到这是怎么回事:每次连续点击打开ViewController,内存使用量都会增加200MB甚至更多,而不会被释放。
要从ViewController返回主菜单:
@objc func didTapButton(){
ViewController.updateFirebaseValues()
ViewController.camera.stop()
if #available(iOS 14.0, *) {
let vc = UIHostingController(rootView: ContentView())
vc.modalPresentationStyle = .fullScreen
present(vc, animated: true, completion: nil)
// self.presentingViewController?.dismiss(animated: true, completion: nil)
} else {
// Fallback on earlier versions
}
}
我认为问题在于我不断地从故事板实例化新的视图控制器,并在点击按钮时显示它们,而不删除以前创建的视图控制器。在这里:
func makeUIViewController(context: UIViewControllerRepresentableContext) -> UIViewController {
let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
let controller = storyboard.instantiateViewController(identifier: "StartTraining")
return controller
}
所以我的问题是:在关闭视图控制器并返回SwiftUI视图时,从switui视图打开uikit视图控制器并释放所有内存的最佳做法是什么?
非常感谢!
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报