SwiftUI, вызывайте функцию после того, как что-то случится в UIViewRepresentable - PullRequest
0 голосов
/ 27 апреля 2020

Когда для моего UISearchbar вызывается метод делегата searchBarButtonClicked, как мне вызвать функцию refresh() в моем классе представления?

SearchBar: UIViewRepresentable

import Foundation
import SwiftUI

struct SearchBar: UIViewRepresentable {

@Binding var text: String

class Coordinator: NSObject, UISearchBarDelegate {
        @Binding var text: String

        init(text: Binding<String>) {
            _text = text
        }

        func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
            text = searchText
        }

        func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
            searchBar.resignFirstResponder()
        }
    }
    func makeCoordinator() -> SearchBar.Coordinator {
        return Coordinator(text: $text)
    }

    func makeUIView(context: UIViewRepresentableContext<SearchBar>) -> UISearchBar {
        let searchBar = UISearchBar(frame: .zero)
        searchBar.delegate = context.coordinator
        searchBar.enablesReturnKeyAutomatically = false
        searchBar.searchBarStyle = .minimal
        return searchBar
    }

    func updateUIView(_ uiView: UISearchBar, context: UIViewRepresentableContext<SearchBar>) {
        uiView.text = text
    }
}

MyView: просмотр

import SwiftUI

struct MyView: View {
    @State private var searchTerm: String = ""

    func refresh() {
        //how do i call this function from `SearchBar`?
    }

    var body: some View {
        SearchBar(text: $searchTerm).padding(.top, 5)
    }
}

1 Ответ

0 голосов
/ 27 апреля 2020

Я смог решить эту проблему, используя NotificationCenter

  1. Расширение уведомлений

    // MARK: - NSNotification
    extension NSNotification {
        static let SearchPressed = NSNotification.Name.init("SearchPressed")
    }
    
  2. Добавьте Observer к onReceive

    var body: some View {
        VStack {
            //...
        }.onReceive(NotificationCenter.default.publisher(for: NSNotification.SearchPressed)) { _ in
        self.refresh() }
    }
    
  3. Добавьте это Notification post к методу делегата: searchBarSearchButtonClicked

    NotificationCenter.default.post(name: NSNotification.SearchPressed,
        object: nil, userInfo: nil)
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...