2016-04-25 3 views
4

В нашем приложении мы имеем UITableViewController, который имеет UISearchController: контроллер представленияОтмена поиска с UISearchController вызывает сбой

searchController = [[UISearchController alloc] initWithSearchResultsController:nil]; 
self.searchController.searchResultsUpdater = self; 
[self.searchController.searchBar sizeToFit]; 

self.tableView.tableHeaderView = self.searchController.searchBar; 
self.showFooterView = YES; 

self.searchController.delegate = self; 
self.searchController.dimsBackgroundDuringPresentation = NO; // default is YES 
self.searchController.searchBar.delegate = self; 
self.definesPresentationContext = YES; 

В таблице также является UISearchBarDelegate и UISearchControllerDelegate.

#pragma mark - UISearchBarDelegate 
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar { 
    [searchBar resignFirstResponder]; 
} 

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar { 
    self.contacts = self.allContacts; 
    [self.tableView reloadData]; 
} 

Теперь все работает, как ожидалось, но бывают случаи, когда пользователь начинает поиск, типы в нескольких символов в строке поиска, результаты возвращаются, и пользователь отменяет поиск, а затем это происходит:

Fatal Exception: NSInvalidArgumentException 
-[_UIFullscreenPresentationController adaptivePresentationController]: unrecognized selector sent to instance 0x147c81ce0 

Fatal Exception: NSInvalidArgumentException 
0 CoreFoundation     0x1842b4f48 __exceptionPreprocess 
1 libobjc.A.dylib    0x198d77f80 objc_exception_throw 
2 CoreFoundation     0x1842bbc5c __methodDescriptionForSelector 
3 CoreFoundation     0x1842b8c00 ___forwarding___ 
4 CoreFoundation     0x1841bccac _CF_forwarding_prep_0 
5 UIKit       0x18a1ba084 -[UISearchController _searchPresentationController] 
6 UIKit       0x189e7d10c -[_UISearchControllerTransplantSearchBarAnimator animateTransition:] 
7 UIKit       0x189b9fa90 __56-[UIPresentationController runTransitionForCurrentState]_block_invoke 
8 UIKit       0x189af856c _runAfterCACommitDeferredBlocks 
9 UIKit       0x189b054bc _cleanUpAfterCAFlushAndRunDeferredBlocks 
10 UIKit       0x189839984 _afterCACommitHandler 
11 CoreFoundation     0x18426bbd0 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ 
12 CoreFoundation     0x184269974 __CFRunLoopDoObservers 
13 CoreFoundation     0x184269da4 __CFRunLoopRun 
14 CoreFoundation     0x184198ca0 CFRunLoopRunSpecific 
15 GraphicsServices    0x18f3d4088 GSEventRunModal 
16 UIKit       0x1898b0ffc UIApplicationMain 

Мы никогда не смогли воспроизвести эту ошибку, хотя она получила информацию от Fabric о производстве.

Эта проблема выглядит примерно так: Selecting cell after search doesn't segue visually, but loads next view Swift Xcode, но ответа на этот вопрос пока нет.

Я начал изучать контроллеры презентаций, но у нас нет специальной функциональности, которая требовала бы настройки контроллеров презентаций определенным образом.

Любые идеи о том, как исправить это?

Thanks

+0

Вы нашли ответ. или все еще вы столкнулись с проблемой. Уверенная проблема с вашим уровнем кода. вы пытаетесь получить доступ, но этого не было в памяти – karthik

ответ

2

Я столкнулся с той же проблемой в Swift.

Проблема заключается в том, что Searchbarcontroller все еще удерживает ссылку (делегата) вашего ViewController.

Так все, что вам нужно сделать, это вручную удалить ссылку, когда вид dealloc или исчезают

Что-то вроде этого:

- (void)dealloc { 
    self.searchController.searchResultsUpdater = nil; 
    self.searchController.searchBar.delegate = nil; 
    self.searchController.delegate = nil; 
    self.searchController = nil; 
} 
+0

это работало для меня –

0

Попробуйте очистить все ваши ссылки, как указано ниже.

-(void)dealloc{ 
    if (_searchController) { 
     _searchController.searchResultsUpdater = nil; 
     _searchController.searchBar.delegate = nil; 
     _searchController.delegate = nil; 
    } 
} 
+0

нет необходимости в проверке _searchController, так как другой код работает на nil, также вам не нужно ссылаться на ivar, но можете безопасно использовать self.getter –

Смежные вопросы