2016-08-03 1 views
0

Я разрабатываю приложение iOS, которое имеет функцию, которая использует UISearchController для предоставления функции поиска для списка стран. До последнего выпуска все работает нормально. Но теперь, добавив некоторые новые функции в приложение, я сталкиваюсь с необычной ошибкой, которая приводит к сбою приложения. Каждый раз, когда я пытался позвонить UISearchController(searchResultsController:nil), мое приложение потерпит крах по причине [UIView setImage:]: unrecognized selector sent to instance. Я проследил все предыдущие коммиты от предыдущего выпуска до сих пор, но до сих пор не нашел виновника. Я хотел бы попросить предложение о том, как отлаживать это, поскольку я не могу отлаживать его в UISearchController.[UIView setImage:]: непризнанный селектор, отправленный в экземпляр, когда init UISearchController

ПРИМЕЧАНИЕ Я не предоставлю фрагмент кода, потому что я считаю излишним, я попробовал несколько способов, в том числе вызова UISearchController(searchResultsController:nil) в другом месте, удалите использование UISearchController, удалены некоторые подозрительные расширения ... чтобы убедиться, что скоро не дал мне еще один ложный отчет об ошибке

EDIT целевой версии моего приложения является 8,0, и я использую быстрый 2.2 на XCode 7.3.1, MacOS El Capitan

EDIT 2 Я попытался переключиться на [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];, но, к сожалению, по этой же причине по-прежнему терпел крах.

EDIT 3 журнала Краш из Crashlytics:

Fatal Exception: NSInvalidArgumentException 
0 CoreFoundation     0x181ec2db0 __exceptionPreprocess 
1 libobjc.A.dylib    0x181527f80 objc_exception_throw 
2 CoreFoundation     0x181ec9c4c __methodDescriptionForSelector 
3 CoreFoundation     0x181ec6bec ___forwarding___ 
4 CoreFoundation     0x181dc4c5c _CF_forwarding_prep_0 
5 UIKit       0x18710f9d0 -[UISearchBar(UISearchBarStatic) _updateMagnifyingGlassView] 
6 UIKit       0x18710d778 -[UISearchBar(UISearchBarStatic) _setupSearchField] 
7 UIKit       0x18719d2c8 -[UISearchBar searchField] 
8 UIKit       0x187114684 -[UISearchBar setPlaceholder:] 
9 UIKit       0x1879c0d3c -[UISearchController _commonInit] 
10 UIKit       0x1879c10cc -[UISearchController initWithSearchResultsController:] 
11 EMCCountryPickerController  0x100bda6e8 -[EMCCountryPickerController loadView] (EMCCountryPickerController.m:136) 
12 UIKit       0x1870208ec -[UIViewController loadViewIfRequired] 
13 UIKit       0x187020844 -[UIViewController view] 
14 UIKit       0x18790f450 -[_UIFullscreenPresentationController _setPresentedViewController:] 
15 UIKit       0x18737cd90 -[UIPresentationController initWithPresentedViewController:presentingViewController:] 
16 UIKit       0x1873a2af4 -[UIViewController _presentViewController:withAnimationController:completion:] 
17 UIKit       0x1873a5890 -[UIViewController _performCoordinatedPresentOrDismiss:animated:] 
18 UIKit       0x18711b3cc -[UIViewController presentViewController:animated:completion:] 
19 UIKit       0x193c3084c -[UIViewControllerAccessibility presentViewController:animated:completion:] 
20 bluebird-ios     0x10012e244 CountryPicker.didTapOnView() ->() (CountryPicker.swift:132) 
21 bluebird-ios     0x10012e29c @objc CountryPicker.didTapOnView() ->() (CountryPicker.swift) 
22 UIKit       0x1875b1f30 _UIGestureRecognizerSendTargetActions 
23 UIKit       0x1871c6728 _UIGestureRecognizerSendActions 
24 UIKit       0x1870537a0 -[UIGestureRecognizer _updateGestureWithEvent:buttonEvent:] 
25 UIKit       0x1875b3530 ___UIGestureRecognizerUpdate_block_invoke898 
26 UIKit       0x1870124d8 _UIGestureRecognizerRemoveObjectsFromArrayAndApplyBlocks 
27 UIKit       0x18700f254 _UIGestureRecognizerUpdate 
28 UIKit       0x187051610 -[UIWindow _sendGesturesForEvent:] 
29 UIKit       0x187050c0c -[UIWindow sendEvent:] 
30 UIKit       0x18702104c -[UIApplication sendEvent:] 
31 UIKit       0x193c0545c -[UIApplicationAccessibility sendEvent:] 
32 UIKit       0x18701f628 _UIApplicationHandleEventQueue 
33 CoreFoundation     0x181e7909c __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ 
34 CoreFoundation     0x181e78b30 __CFRunLoopDoSources0 
35 CoreFoundation     0x181e76830 __CFRunLoopRun 
36 CoreFoundation     0x181da0c50 CFRunLoopRunSpecific 
37 GraphicsServices    0x183688088 GSEventRunModal 
38 UIKit       0x18708a088 UIApplicationMain 
39 bluebird-ios     0x100225a3c main (AppDelegate.swift:13) 
40 libdispatch.dylib    0x18193e8b8 (Missing) 

ответ

0

Вы не можете сразу положить изображение на просмотр в такой манере. Для этого следуйте этому фрагменту.

UIView *view=[[UIView alloc]initWithFrame:CGRectMake(x, y, width, height)]; 
[view setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"imageName.png"]]]; 

Или вы могли бы нарисовали выход из imageView но настроите вид в Interface Builder как UIView, а не UIImageView. Вы должны изменить его на UIImageView. Крушение не имеет ничего общего с searchReslutController, возможно, вы ошибаетесь в своем imageView.

+0

Привет @Ishika, спасибо за ваш ответ. Но, к сожалению, я не думаю, что ваше предложение будет работать в моем случае.Поскольку я попытался создать пустой контроллер представления только с одним UIButton, эта кнопка привязана к действию, которое делает только одно действие, которое вызывает UISearchController (searchResultsController: nil) ', и оно все еще вызывает сбой –

+0

. Затем попробуйте переместить вашу инициализацию кода в viewDidLoad() и проверить, работает ли он или нет. – Ishika

1

Проблема решаемая

Основная причина в том, что на Initialize, UISearchBar позвонит _updateMagnifyingGlassView которые устанавливают увеличительного изображение для левого зрения его UITextField. В моем коде у меня есть следующее расширение:

extension UITextField { 
    @IBInspectable var paddingLeft: CGFloat { 
     get { 
      return self.leftView?.frame.width ?? 0 
     } set { 
      let paddingView = UIView(frame: CGRectMake(0, 0, newValue, self.frame.height)) 
      self.leftView  = paddingView 
      self.leftViewMode = .Always 
     } 
    } 
} 

Обратите внимание, что свойство paddingLeft не является необязательным свойство, которое будет вызывать UITextField установить 0 в качестве значения по умолчанию для этого свойства, следовательно, создавая вид с шириной = 0 и назначить до leftView методом сеттера. Эта причина вызывает ошибку UISearchBar, когда _updateMagnifyingGlassView вызывается, как вы можете видеть в журналах аварий.

Заключение

Будьте осторожны при использовании расширения, особенно, когда он будет изменять поведение по умолчанию управления существующего UIKit в

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

  • Нет связанных вопросов^_^