I have made a View in SwiftUI and I’m trying to display it as a pop over to my current UIKit ViewController. I managed it to display my SwiftUI.View but the toolbar is hidden / not displayed. Has anyone an idea? Below is the code, I have shortened it to the most important parts so that they are easier to read
import SwiftUI
import PhotosUI
struct RoomDetailsEditView: View {
@StateObject var viewModel: RoomDetailEditModel
@State private var selectedItem: PhotosPickerItem? = nil
@ToolbarContentBuilder
private var toolbar: some ToolbarContent {
ToolbarItem(placement: .cancellationAction) {
Button("Abbrechen") {
dismiss()
}
}
ToolbarItem(placement: .confirmationAction) {
Button("Speichern") {
viewModel.saveProfileData()
dismiss()
}.self.disabled(!viewModel.viewGotEdited)
}
}
private var topicSection: some View {...}
private var avatar: some View {...}
private var roomNameSection: some View {...}
var body: some View {
Form {
avatar
roomNameSection
topicSection
}
.scrollDismissesKeyboard(.immediately)
.navigationTitle("Raum bearbeiten")
.navigationBarTitleDisplayMode(.inline)
.toolbar { toolbar }
}
}
import Foundation
import UIKit
import SwiftUI
class RoomInformationViewController: UIViewController {
var collectionView: UICollectionView! = nil
var dataSource: UICollectionViewDiffableDataSource<RoomInformationViewSections, RoomInformationElement>! = nil
var room: Room! = nil
override func viewDidLoad() {
super.viewDidLoad()
self.initNavigationBar()
self.initCollectionView()
self.loadDataSource()
}
...
@objc func editRoomData() {
let viewModel = RoomDetailEditModel(room: self.room, isProfileEdit: false)
let editRoomView = RoomDetailsEditView(viewModel: viewModel)
let wrapperViewController = ViewControllerWrapper(rootView: editRoomView)
let navController = UINavigationController(rootViewController: wrapperViewController)
navController.modalPresentationStyle = .popover
navController.modalTransitionStyle = .coverVertical
self.present(navController, animated: true, completion: nil)
}
...
}
class ViewControllerWrapper<Content: View>: UIViewController {
private var hostingController: UIHostingController<Content>!
init(rootView: Content) {
super.init(nibName: nil, bundle: nil)
hostingController = UIHostingController(rootView: rootView)
}
required init?(coder: NSCoder) {
super.init(coder: coder)
}
override func viewDidLoad() {
super.viewDidLoad()
addChild(hostingController)
view.addSubview(hostingController.view)
hostingController.view.frame = view.bounds
hostingController.didMove(toParent: self)
print(hostingController.navigationItem.title)
navigationController?.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "a", style: .plain, target: nil, action: nil)
}
}




