#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 Я только что добавил сообщение об ошибке к вопросу