我试图在我的自定义导航栏中添加一个按钮,问题是当我向导航栏中添加栏按钮项时,它不允许我创建 @objc 方法,为了避免它,我创建了一个不同的类对于 objc 方法,但这似乎也不起作用,代码接受选择器方法,但在运行时点击时不会触发。
计划是在点击此按钮时启动侧边菜单,该按钮已添加且可见,但该操作不起作用,任何解决方法或帮助将不胜感激。
struct CustomNavigationBar: UIViewControllerRepresentable {
func makeCoordinator() -> Coordinator {
return CustomNavigationBar.Coordinator(parent: self)
}
// Properties
/// Ease of Use
var view : AnyView
var title : String //Will be location of the user
/// On Search and On Cancel Closures
var onSearch : (String) -> ()
var onCancel : () -> ()
var didTapMenu : () -> ()
// Require Closures on initialization
init(view: AnyView, title : String, onSearch : @escaping (String)->(), onCancel : @escaping () -> (), didTapMenu : @escaping () -> ()) {
self.view = view
self.title = title
self.onSearch = onSearch
self.onCancel = onCancel
self.didTapMenu = didTapMenu
}
// Integrating UIKit Navigation Controller with SwiftUI View
func makeUIViewController(context: Context) -> UINavigationController {
//Requires SwiftUIView
let childView = UIHostingController(rootView: view)
let controller = UINavigationController(rootViewController: childView)
// Navigation Bar Data
controller.navigationBar.topItem?.title = title
controller.navigationBar.prefersLargeTitles = false
// Navigation Bar Customization
controller.navigationBar.barTintColor = UIColor(Color.grubSoulRed)
controller.navigationBar.tintColor = UIColor.white
controller.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.white, .font: UIFont(name: "Poppins-Bold", size: 17)!]
//Adding Navigation Button // ===> Problem Here
let menuButton = UIBarButtonItem(image: UIImage(named: "hamburgerMenu"), style: .plain, target: nil, action: #selector(navigationActions.hamburgerTapped(_:)))
childView.navigationItem.leftBarButtonItem = menuButton
// Search Bar
let searchController = UISearchController()
searchController.searchBar.placeholder = "Search here for products..."
/// Search Bar Customization
searchController.searchBar.searchTextField.backgroundColor = UIColor.white
searchController.searchBar.searchTextField.layer.masksToBounds = true
searchController.searchBar.searchTextField.layer.cornerRadius = 17
searchController.obscuresBackgroundDuringPresentation = true
/// Setting search bar delegate
searchController.searchBar.delegate = context.coordinator
/// Adding Search Bar
controller.navigationBar.topItem?.searchController = searchController
controller.navigationBar.topItem?.hidesSearchBarWhenScrolling = false
return controller
}
func updateUIViewController(_ uiViewController: UINavigationController, context: Context) {
}
// Search Bar delegate
class Coordinator: NSObject, UISearchBarDelegate {
var parent : CustomNavigationBar
init(parent: CustomNavigationBar) {
self.parent = parent
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
self.parent.onSearch(searchText)
}
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
self.parent.onCancel()
}
}}
open class navigationActions {
@objc func hamburgerTapped(_ sender : UIButton) {
print("hamburger tapped")
// Launch Hamburger menu
}}
答案 0 :(得分:0)
无需创建新类,
在 hamburgerTapped
类中声明 Coordinator
函数并将目标设置为 Coordinator
类并从 Coordinator
let menuButton = UIBarButtonItem(image: UIImage(named: "hamburgerMenu"), style: .plain, target: context.coordinator, action: #selector(context.coordinator.hamburgerTapped(_:))) // <--- Here!!
在 Coordinator
类中
// Search Bar delegate
class Coordinator: NSObject, UISearchBarDelegate {
// Other code
@objc func hamburgerTapped(_ sender : UIButton) { // <-- Here!!
print("hamburger tapped")
// Launch Hamburger menu
}
}