如何通过htmlselect标签创buildUIPickerView的对象引用

我有一个UIWebview包含一个HTML“select”标签,它显示为一个 下拉列表 屏幕上。

当我点击下拉菜单时,UIWebview自动popup一个UIWebSelectSinglePicker视图,显示为 默认OS pickerview

我想改变select器视图的背景颜色和文字颜色。 我怎样才能达到这个目标?

我试图听UIKeyboardWillShowNotification事件,但那一刻,这个视图还没有创build。

预先感谢任何帮助。

我自己设法解决了这个问题。

如果有人也想在运行中更改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; } 

希望它会有所帮助。

我相信我已经想出了一个替代解决scheme来解决这个问题。 在标签颜色显示不正确的情况下(使用系统默认值而不是覆盖的颜色)提出了另一种解决scheme。 滚动项目列表时发生这种情况。

为了防止这种情况的发生,我们可以使用方法调整来修复标签颜色的来源(而不是在已经创build之后修补它们)。

显示UIWebSelectSinglePicker (如您所述),它实现了UIPickerViewDelegate协议。 这个协议负责提供NSAttributedString实例,这些实例通过- (NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component方法显示在select器视图中。 通过与我们自己的实现混合,我们可以重写标签的外观。

为此,我在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 

这样做的结果是,当一个标签被请求的时候,我们的override函数被调用,它调用了原始函数,这个函数方便地返回一个可变的NSAttributedString,我们可以随意修改它。 我们可以完全replace返回值,如果我们想保持文本。 find您可以在这里更改的属性列表 。

这个解决scheme允许你通过一次调用全局地改变应用程序中的所有Picker视图,而不需要为需要此代码的每个视图控制器注册通知(或定义一个基类来执行相同操作)。