Как получить объектное рефери 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 в приложении с помощью одного вызова, устраняя необходимость регистрации уведомлений для каждого контроллера представлений, где этот код необходим (или определения базового класса для этого).

  • Как показать видеофайл в виде коллекции как файл изображения?
  • как использовать автоматическую компоновку при установке цели 5.1 в xcode 5
  • Ошибка Xcode при попытке запустить проект из-за LLDB
  • Как локализовать мое приложение с помощью Xcode 5?
  • Загрузить xcappdata на устройство из командной строки
  • Не удалось загрузить тестовый комплект, поскольку непредвиденная ошибка
  • Как подавить предупреждения в Xcode?
  • xcode5 iOS Simulator не смог установить приложение
  • Приложение сбой во время ввода контроллера просмотра
  • AssertMacros.h: Ожидаемый конец строки в выражении препроцессора
  • Кнопки панели вкладок все серые
  • Interesting Posts

    Основы iCloud и примеры кода

    Сортировка пользовательских объектов NSArray другими пользовательскими объектами NSArray

    Работает ли TWRequest для потокового потока twitter?

    Выбор языка клавиатуры для UITextField с помощью secureTextEntry

    Как вернуться назад, чтобы указать viewController из navigationController (viewControllers / stack)?

    Справочная служба Alamofire, глобальный менеджер? Глобальный заголовок авторизации?

    Как использовать различные эффекты или фильтры в приложении iphone camera

    Проблемы с выполнением теста командной строки Xcode

    UISearchController – Предупреждение Попытка загрузить представление контроллера вида

    Почему мое устройство iOS не распознает мой голос?

    Доступ к частной собственности (начиная с подчеркивания) с использованием KVC, рассматриваемого с использованием частного API?

    Запуск сценария между компиляцией и компоновкой

    Анализ изображения и поиск точек в iOS

    Ошибка crashlytics iOS xcode 5 – Ошибка вызова скрипта скрипта. ./Crashlytics.framework/run: разрешение отклонено

    Импорт файла pfx в приложение iOS

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