Панель пользовательского поиска получает уведомление при выборе

#arrays #swift #uisearchbar #uisearchcontroller #uisearchbardelegate

#массивы #swift #панель пользовательского поиска #uisearchcontroller #uisearchbardelegate

Вопрос:

Я пытаюсь создать представление, подобное странице Instagram explore. Чтобы быть точным, я хочу иметь одно представление с UISearchBar на панели навигации, и если выбрана строка поиска, я хочу перейти к новому представлению.

Я работаю с SwiftUI и уже реализовал панель поиска следующим образом:

 class SearchBar: NSObject, ObservableObject {
    
    @Published var text: String = ""
    let searchController: UISearchController = UISearchController(searchResultsController: nil)
    var onChange: () -> Void = {}
    
    override init() {
        super.init()
        self.searchController.obscuresBackgroundDuringPresentation = false
        self.searchController.searchResultsUpdater = self
    }
    
    convenience init(onChange: @escaping() -> Void) {
        self.init()
        self.onChange = onChange
    }
}

extension SearchBar: UISearchResultsUpdating {
    
    func updateSearchResults(for searchController: UISearchController) {
        // Publish search bar text changes.
        if let searchBarText = searchController.searchBar.text {
            self.text = searchBarText
            self.onChange()
        }
    }
}

struct SearchBarModifier: ViewModifier {
    
    let searchBar: SearchBar
    
    func body(content: Content) -> some View {
        content
            .overlay(
                ViewControllerResolver { viewController in
                    viewController.navigationItem.titleView = self.searchBar.searchController.searchBar
                    self.searchBar.searchController.hidesNavigationBarDuringPresentation = false
                    self.searchBar.searchController.searchBar.searchTextField.backgroundColor = .white
                }
                .frame(width: 0, height: 0)
            )
    }
}

extension View {
    func add(_ searchBar: SearchBar) -> some View {
        return self.modifier(SearchBarModifier(searchBar: searchBar))
        
    }
}
  

На данный момент я попытался добавить UITapGestureRecognizer в панель поиска следующим образом:

 viewController.navigationItem.titleView?.addGestureRecognizer(UITapGestureRecognizer(target: someClass, action: #selector(someClass.someFunction)))
  

Но он всегда зависал при открытии основного представления.

Это сообщение об ошибке:

 2020-08-23 20:27:25.042221 0200 Envim[31277:771485] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid number value (NaN) in JSON write'
*** First throw call stack:
(
    0   CoreFoundation                      0x00007fff23e3cf0e __exceptionPreprocess   350
    1   libobjc.A.dylib                     0x00007fff50ba89b2 objc_exception_throw   48
    2   Foundation                          0x00007fff259fcde2 _writeJSONNumber   1129
    3   Foundation                          0x00007fff259fda33 ___writeJSONObject_block_invoke   371
    4   libswiftCore.dylib                  0x00007fff512f7c4d $ss26_SwiftDeferredNSDictionaryC23enumerateKeysAndObjects7options5usingySi_ys9UnmanagedVyyXlG_AHSpys5UInt8VGtXBtFTf4dnn_n   397
    5   libswiftCore.dylib                  0x00007fff510d4155 $ss26_SwiftDeferredNSDictionaryC23enumerateKeysAndObjects7options5usingySi_ys9UnmanagedVyyXlG_AHSpys5UInt8VGtXBtFTo   37
    6   Foundation                          0x00007fff259fd003 _writeJSONObject   475
    7   Foundation                          0x00007fff259fa320 -[_NSJSONWriter dataWithRootObject:options:error:]   86
    8   Foundation                          0x00007fff259fc3fa  [NSJSONSerialization dataWithJSONObject:options:error:]   145
    9   Envim                               0x000000010d2d51c6 $sSe5EnvimE14fromDictionaryxyp_tKcfC   406
    10  Envim                               0x000000010d2fc12d $s5Envim7BlogAPIC16loadPopularBlogs9onSuccessyySayAA0B0VGc_tFySo16FIRQuerySnapshotCSg_s5Error_pSgtcfU_   1549
    11  Envim                               0x000000010d2ea98b $sSo16FIRQuerySnapshotCSgs5Error_pSgIeggg_ACSo7NSErrorCSgIeyByy_TR   139
    12  Envim                               0x000000010d74ac88 _ZZ35-[FIRQuery wrapQuerySnapshotBlock:]EN9Converter7OnEventEN8firebase9firestore4util8StatusOrINS1_3api13QuerySnapshotEEE   152
    13  Envim                               0x000000010d8eb597 _ZZN8firebase9firestore3api5Query12GetDocumentsENS1_6SourceEONSt3__110unique_ptrINS0_4core13EventListenerINS1_13QuerySnapshotEEENS4_14default_deleteIS9_EEEEEN10ListenOnce7OnEventENS0_4util8StatusOrIS8_EE   839
    14  Envim                               0x000000010d8ed294 _ZZN8firebase9firestore3api5Query19AddSnapshotListenerENS0_4core13ListenOptionsEONSt3__110unique_ptrINS3_13EventListenerINS1_13QuerySnapshotEEENS5_14default_deleteIS9_EEEEEN9Converter7OnEventENS0_4util8StatusOrINS3_12ViewSnapshotEEE   612
    15  Envim                               0x000000010d749551 _ZZN8firebase9firestore4core18AsyncEventListenerINS1_12ViewSnapshotEE7OnEventENS0_4util8StatusOrIS3_EEENKUlvE_clEv   177
    16  Envim                               0x000000010d74947d _ZNSt3__1L8__invokeIRZN8firebase9firestore4core18AsyncEventListenerINS3_12ViewSnapshotEE7OnEventENS2_4util8StatusOrIS5_EEEUlvE_JEEEDTclclsr3std3__1E7forwardIT_Efp_Espclsr3std3__1E7forwardIT0_Efp0_EEEOSC_DpOSD_   29
    17  Envim                               0x000000010d74942d _ZNSt3__128__invoke_void_return_wrapperIvE6__callIJRZN8firebase9firestore4core18AsyncEventListenerINS5_12ViewSnapshotEE7OnEventENS4_4util8StatusOrIS7_EEEUlvE_EEEvDpOT_   29
    18  Envim                               0x000000010d7493fd _ZNSt3__110__function12__alloc_funcIZN8firebase9firestore4core18AsyncEventListenerINS4_12ViewSnapshotEE7OnEventENS3_4util8StatusOrIS6_EEEUlvE_NS_9allocatorISB_EEFvvEEclEv   29
    19  Envim                               0x000000010d74809e _ZNSt3__110__function6__funcIZN8firebase9firestore4core18AsyncEventListenerINS4_12ViewSnapshotEE7OnEventENS3_4util8StatusOrIS6_EEEUlvE_NS_9allocatorISB_EEFvvEEclEv   30
    20  Envim                               0x000000010d5e47e5 _ZNKSt3__110__function12__value_funcIFvvEEclEv   53
    21  Envim                               0x000000010d5e1fb5 _ZNKSt3__18functionIFvvEEclEv   21
    22  Envim                               0x000000010d9d58d5 _ZN8firebase9firestore4util4Task17ExecuteAndReleaseEv   229
    23  Envim                               0x000000010d65e5ed _ZN8firebase9firestore4util19ExecutorLibdispatch11InvokeAsyncEPv   29
    24  libdispatch.dylib                   0x0000000111e58e8e _dispatch_client_callout   8
    25  libdispatch.dylib                   0x0000000111e66d97 _dispatch_main_queue_callback_4CF   1149
    26  CoreFoundation                      0x00007fff23da0909 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__   9
    27  CoreFoundation                      0x00007fff23d9b459 __CFRunLoopRun   2041
    28  CoreFoundation                      0x00007fff23d9a944 CFRunLoopRunSpecific   404
    29  GraphicsServices                    0x00007fff38ba6c1a GSEventRunModal   139
    30  UIKitCore                           0x00007fff48c8b9ec UIApplicationMain   1605
    31  Envim                               0x000000010d39d631 $s5Envim0A10AppWrapperV4mainyyFZ   305
    32  Envim                               0x000000010d39d6a9 $s5Envim0A10AppWrapperV5$mainyyFZ   9
    33  Envim                               0x000000010d39d6c4 main   20
    34  libdyld.dylib                       0x00007fff51a231fd start   1
)
libc  abi.dylib: terminating with uncaught exception of type NSException
  

Кто-нибудь знает, как я могу получать уведомления при выборе панели поиска?

Комментарии:

1. Какой тип ошибки вы получили на консоли?

2. @Mannopson Я только что добавил сообщение об ошибке к вопросу