如何在 UIViewControllerRepresentable Struct 中创建 UIBarButtonItem?

时间:2021-07-31 08:20:59

标签: ios swift objective-c xcode swiftui

我试图在我的自定义导航栏中添加一个按钮,问题是当我向导航栏中添加栏按钮项时,它不允许我创建 @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
}}

1 个答案:

答案 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
    }
}