Как получить объектное рефери UIPickerView при создании через тег html select

У меня UIWebview содержит тег html "select", который показан как выпадающий список на экране.

Когда я нажимаю раскрывающийся список, UIWebview автоматически отображает UIWebSelectSinglePicker View, который отображается как стандартная ОС pickerview ,

Я хочу изменить цвет фона и цвет текста выбора. Как я могу достичь этой цели?

Я пытался прослушать событие UIKeyboardWillShowNotification, но в этот момент это представление не было создано.

Заранее благодарим за любую помощь.

2 Solutions collect form web for “Как получить объектное рефери UIPickerView при создании через тег html select”

Мне удалось решить проблему самостоятельно.

Если кто-то также хочет изменить UIPickView на лету, пожалуйста, взгляните:

Сначала добавьте прослушиватель в событие UIKeyboardWillShowNotification.

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_pickerViewWillBeShown:) name:UIKeyboardWillShowNotification object:nil]; 

Во-вторых, когда уведомление об увольнении, вызовите метод изменения цвета фона после задержки. <- Это очень важно, если метод вызова без задержки, pickview в данный момент не существует.

 - (void)_pickerViewWillBeShown:(NSNotification*)aNotification { [self performSelector:@selector(_resetPickerViewBackgroundAfterDelay) withObject:nil afterDelay:0]; } 

В-третьих, просмотрите окна UIApplication и найдите pickerView. И вы можете изменить то, что вы хотите для pickerView.

 -(void)_resetPickerViewBackgroundAfterDelay { UIPickerView *pickerView = nil; for (UIWindow *uiWindow in [[UIApplication sharedApplication] windows]) { for (UIView *uiView in [uiWindow subviews]) { pickerView = [self _findPickerView:uiView]; } } if (pickerView){ [pickerView setBackgroundColor:UIColorFromRGB(0x00FF00)]; } } (UIPickerView *) _findPickerView:(UIView *)uiView { if ([uiView isKindOfClass:[UIPickerView class]] ){ return (UIPickerView*) uiView; } if ([uiView subviews].count > 0) { for (UIView *subview in [uiView subviews]){ UIPickerView* view = [self _findPickerView:subview]; if (view) return view; } } return nil; } 

Надеюсь, это поможет.

Я считаю, что придумал альтернативное решение этой проблемы. Существуют определенные обстоятельства с другим предложенным решением, в котором цвета ярлыков отображаются некорректно (с использованием системного значения по умолчанию вместо переопределенного цвета). Это происходит при прокрутке списка элементов.

Чтобы этого не произошло, мы можем использовать метод swizzling, чтобы исправить цвета ярлыков в их источнике (вместо того, чтобы исправлять их после их создания).

UIWebSelectSinglePicker показан (как вы заявили), который реализует протокол UIPickerViewDelegate. Этот протокол позаботится о предоставлении экземпляров NSAttributedString, которые отображаются в представлении выбора, с помощью - (NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component . Путем реализации своей собственной работы мы можем переопределить, как выглядят ярлыки.

Для этого я определил категорию в UIPickerView:

 @implementation UIPickerView (LabelColourOverride) - (NSAttributedString *)overridePickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component { // Get the original title NSMutableAttributedString* title = (NSMutableAttributedString*)[self overridePickerView:pickerView attributedTitleForRow:row forComponent:component]; // Modify any attributes you like. The following changes the text colour. [title setAttributes:@{NSForegroundColorAttributeName : [UIColor redColor]} range:NSMakeRange(0, title.length)]; // You can also conveniently change the background of the picker as well. // Multiple calls to set backgroundColor doesn't seem to slow the use of // the picker, but you could just as easily do a check before setting the // colour to see if it's needed. pickerView.backgroundColor = [UIColor yellowColor]; return title; } @end 

Затем, используя метод swizzling ( см. Этот ответ для справки ), мы заменяем реализации:

 [Swizzle swizzleClass:NSClassFromString(@"UIWebSelectSinglePicker") method:@selector(pickerView:attributedTitleForRow:forComponent:) forClass:[UIPickerView class] method:@selector(overridePickerView:attributedTitleForRow:forComponent:)]; 

Это реализация Swizzle, разработанная мной по ссылке выше.

 @implementation Swizzle + (void)swizzleClass:(Class)originalClass method:(SEL)originalSelector forClass:(Class)overrideClass method:(SEL)overrideSelector { Method originalMethod = class_getInstanceMethod(originalClass, originalSelector); Method overrideMethod = class_getInstanceMethod(overrideClass, overrideSelector); if (class_addMethod(originalClass, originalSelector, method_getImplementation(overrideMethod), method_getTypeEncoding(overrideMethod))) { class_replaceMethod(originalClass, overrideSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)); } else { method_exchangeImplementations(originalMethod, overrideMethod); } } @end , @implementation Swizzle + (void)swizzleClass:(Class)originalClass method:(SEL)originalSelector forClass:(Class)overrideClass method:(SEL)overrideSelector { Method originalMethod = class_getInstanceMethod(originalClass, originalSelector); Method overrideMethod = class_getInstanceMethod(overrideClass, overrideSelector); if (class_addMethod(originalClass, originalSelector, method_getImplementation(overrideMethod), method_getTypeEncoding(overrideMethod))) { class_replaceMethod(originalClass, overrideSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)); } else { method_exchangeImplementations(originalMethod, overrideMethod); } } @end , @implementation Swizzle + (void)swizzleClass:(Class)originalClass method:(SEL)originalSelector forClass:(Class)overrideClass method:(SEL)overrideSelector { Method originalMethod = class_getInstanceMethod(originalClass, originalSelector); Method overrideMethod = class_getInstanceMethod(overrideClass, overrideSelector); if (class_addMethod(originalClass, originalSelector, method_getImplementation(overrideMethod), method_getTypeEncoding(overrideMethod))) { class_replaceMethod(originalClass, overrideSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)); } else { method_exchangeImplementations(originalMethod, overrideMethod); } } @end 

Результатом этого является то, что когда запрашивается метка, вызывается наша функция переопределения, которая вызывает исходную функцию, которая, как удобно, возвращает нам изменчивую NSAttributedString, которую мы можем изменить в любом случае. Мы могли бы полностью заменить возвращаемое значение, если бы захотели и просто сохранили текст. Найдите список атрибутов, которые вы можете изменить здесь .

Это решение позволяет глобально изменять все представления Picker в приложении с помощью одного вызова, устраняя необходимость регистрации уведомлений для каждого контроллера представлений, где этот код необходим (или определения базового класса для этого).

  • Как исправить «Xcode неожиданно завершает работу при использовании подключаемого модуля libclang.dylib.»?
  • Xcode5: не удалось зарегистрировать "/System/Library/CoreServices/CoreTypes.bundle/Contents/Library/MobileDevices.bundle
  • Как разрешить красный (перемещенный) файл в Xcode 5?
  • Нет кнопки Round Rect в Xcode 5?
  • Подготовка неподписанного Xcarchive
  • Могу ли я сделать точку останова Xcode, когда определенный класс добавляется в пул автозапуска?
  • Xcode5 - не удается добавить идентификатор Apple
  • Поверните окно раскадровки в xcode 5
  • Не удается загрузить изображение запуска из каталога активов
  • Ошибки DP5 в IOHIDEventQueue.c
  • Как навсегда исправить Xcode 5 SpringBoard не удалось запустить приложение с ошибкой: -3
  • Interesting Posts

    Как программно добавить InputAccessoryView с Autolayout?

    Отправка и получение файлов cookie на / из сервера в Swift

    Жизненный цикл UIViewController в сочетании с восстановлением состояния

    Закрыть сеанс Facebook в Facebook-Ios-Sdk

    Архивировать и распространять приложение iOS в App Store через командную строку

    Swift: память не очищается, когда я перехожу к другому контроллеру представления, получая предупреждение памяти

    Необычный UITableView crash on – : индекс 0 за пределами для пустого массива

    Как получить напоминание о событиях в календаре iPhone на Apple-Watch

    Добавить Cocos2D для проекта в xCode 4

    Не удается endBackgroundTask: фоновая задача не существует с идентификатором 4, или она, возможно, уже была завершена

    iOS NSXMLВыбор неформованного HTML

    Сбой при автоопределении при применении преобразования: сбой утверждения в –

    Установите язык iOS без перезагрузки

    Остановить звук HTML5 от цикла при закрытии iOS Safari

    Каков правильный тип продукта In-App Purchase?

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.